当前位置: 首页 > 知识库问答 >
问题:

如何在.NET中通过MQ发送JMS消息?

胡曾笑
2023-03-14

我正在开发一个可以被描述为自定义WMQ消息路由器/转发器的东西。目前,我在处理通过MQ发送的JMS消息时遇到了一些非常令人困惑的问题。我能够通过JMS接收来自Java应用程序的消息发送(以MQ作为传输),但不能将消息发送到JMSendpoint上侦听的Java应用程序。

[8/2/12 14:38:51:359 CEST] 00000031 SibMessage    W   [:] CWSJY0003W: JMSCC0110: An exception '
                       Message : java.lang.NullPointerException
                         Class : class java.lang.NullPointerException
                         Stack : com.ibm.msg.client.wmq.internal.messages.WMQMessageBase._parseMcdFolder(WMQMessageBase.java:445)
                               : com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.constructProviderMessageFromRFH2(WMQReceiveMarshal.java:341)
                               : com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.createProviderMessage(WMQReceiveMarshal.java:447)
                               : com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.exportProviderMessage(WMQReceiveMarshal.java:607)
                               : com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1115)
                               : com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receive(WMQSyncConsumerShadow.java:334)
                               : com.ibm.msg.client.wmq.internal.WMQSession.loadMessageReference(WMQSession.java:1082)
                               : com.ibm.msg.client.jms.internal.JmsSessionImpl.consume(JmsSessionImpl.java:2847)
                               : com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2549)
                               : com.ibm.mq.jms.MQSession.run(MQSession.java:860)
                               : com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:172)
                               : com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:399)
                               : com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)
[8/2/12 14:38:51:781 CEST] 00000031 SibMessage    W   [:] CWSJY0003W: MQJCA4004: Message delivery to an MDB 'XXX' failed with exception: 'null' 

直接通过JMS发送:

<mcd><Msd>jms_text</Msd></mcd>  

通过我的应用程序发送:

<mcd><Msd dt="string" >jms_text</Msd></mcd>

RFH2中的所有元素也包含type。JMS文件夹中的元素顺序不同,但根据异常情况,问题应该直接发生在MCD文件夹中。我不确定如何更好地诊断该问题--我已经尝试为JMS配置跟踪,但我不知道如何为WAS配置跟踪(我在周二第一次使用WAS)。标准MQ跟踪不提供更多信息。

    null
    null

我不手动创建RFH2结构--我让MQ基础结构来处理它。所以我的问题是:如何从.NET创建有效的JMS消息,并被消息驱动bean接受?

注意:我不想使用IBM.xms-这个决定是很久以前做出的,因为IBM知识库中有一篇文章描述了XMS和WMQ的优缺点。我需要同时支持JMS和非JMS消息传递。

共有1个答案

荣声
2023-03-14

在启用WebSphere跟踪并使用Java反编译程序检查一些WebSphere.jar包之后,我很偶然地找到了错误的原因。

跟踪显示了传递给失败的_parsemcdfolder方法的值:

[8/3/12 12:16:00:199 CEST] 0000003a  > UOW= source=com.ibm.msg.client.wmq.internal.messages.WMQMessageBase method=_parseMcdFolder(String,String,String) (com.ibm.msg.client.wmq.internal.messages.WMQMessageBase) [:] org=IBM prod=WebSphere component=Application Server thread=[WMQJCAResourceAdapter : 0]
          Entry parm0=<mcd><Msd dt="string" >jms_text</Msd></mcd>  parm1=jms_text parm2=<null>
[8/3/12 12:16:00:199 CEST] 0000003a  3 UOW= source=com.ibm.msg.client.jms.internal.JmsSessionImpl org=IBM prod=WebSphere component=Application Server thread=[WMQJCAResourceAdapter : 0]
          (com.ibm.msg.client.jms.internal.JmsSessionImpl) [:/50d450d4] Caught exception: java.lang.NullPointerException in class: com.ibm.msg.client.jms.internal.JmsSessionImpl method: run() <exitIndex: 2>
[8/3/12 12:16:00:199 CEST] 0000003a  1 UOW= source=com.ibm.msg.client.jms.internal.JmsSessionImpl org=IBM prod=WebSphere component=Application Server thread=[WMQJCAResourceAdapter : 0]
          (com.ibm.msg.client.jms.internal.JmsSessionImpl) [:/50d450d4] Tracing exception:
java.lang.NullPointerException
    at com.ibm.msg.client.wmq.internal.messages.WMQMessageBase._parseMcdFolder(WMQMessageBase.java:445)
    at com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.constructProviderMessageFromRFH2(WMQReceiveMarshal.java:341)
    at com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.createProviderMessage(WMQReceiveMarshal.java:447)
    at com.ibm.msg.client.wmq.internal.messages.WMQReceiveMarshal.exportProviderMessage(WMQReceiveMarshal.java:607)
    at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1115)
    at com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receive(WMQSyncConsumerShadow.java:334)
    at com.ibm.msg.client.wmq.internal.WMQSession.loadMessageReference(WMQSession.java:1082)
    at com.ibm.msg.client.jms.internal.JmsSessionImpl.consume(JmsSessionImpl.java:2847)
    at com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2549)
    at com.ibm.mq.jms.MQSession.run(MQSession.java:860)
    at com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:172)
    at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:399)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)

因此,传递给_parsemcdfolder的参数为:

parm0=<mcd><Msd dt="string" >jms_text</Msd></mcd>  parm1=jms_text parm2=<null>
    null
static WMQMessage _parseMcdFolder(String s, String fbClass, String forcedMessageClass)
    throws JMSException
{
    WMQMessage newMessage = null;

    // 350+ lines of code trying to parse s and initialize newMessage
    // but no fallback so newMessage could be null after the processing

    newMessage.isNullMessage = isNullMsgFlag;  // Line 445 - BOOM!
    return newMessage;
}

这个bug在适配器的一些后续版本中得到了修复,但是由于我没有找到任何与此问题相关的文档,所以没有进行交流。

在使用了较新的适配器版本后,问题得到了解决(实际上,我只是转移到了另一个问题上)。

 类似资料:
  • 问题内容: 这是我的使用PARSE发送推送消息的应用程序代码 上面的代码在哪里传递我的请求参数(正文)?如何将我的请求构建为JSON格式?在此先感谢您。请帮助我解决此问题。 问题答案: 使用.net中的parse运行波纹管代码以进行推送通知。

  • 我有一个web应用程序,它通过WebLogic中的JMS与其他Java web应用程序通信。 我读到这样的答案:如何从PHP连接Jms? 我安装了ActiveMQ并尝试使用它。但是在Weblogic中,我们需要“jms_factory”和“queue_name”。我想它使用t3协议。

  • 如何延迟JMS消息发送或在不确定的时间内继续? 我使用的是Weblogic,正如您所知,在JMS发送之后,接收方将异步处理消息,但是,此时或有时外部资源还没有为接收方做好准备,因此,我想使用一些检查逻辑来延迟发送或处理消息。我猜例如:我将消息放入挂起队列,然后频繁检查资源可用性,一旦发送或继续消息? 大家都知道Weblogic是否支持这一点,或者如何实现它吗?

  • 我想使用SpringBoot向ActiveMQ队列发送消息。应用程序应在发送后终止,但仍保持活动状态。 这是我的申请代码: 在没有任何父节点的情况下使用以下依赖项(Maven): 和一行

  • Spring Boot上有一个应用程序,它把它的jms请求放在一个队列中,然后从另一个队列中获取答案。还有一个应用程序正在处理响应队列。请求~每秒100次。实际上,问题是如何处理它们并选择我需要的?现在我使用@JmsListener读取队列中的所有消息,但是那些不适合我的应用程序的消息被绘制出来。创建一个线程并分别等待答案,在我看来,这似乎不是一个好主意,因为可以有几千个线程。如何成为?