我正在开发一个可以被描述为自定义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跟踪不提供更多信息。
我不手动创建RFH2结构--我让MQ基础结构来处理它。所以我的问题是:如何从.NET创建有效的JMS消息,并被消息驱动bean接受?
注意:我不想使用IBM.xms-这个决定是很久以前做出的,因为IBM知识库中有一篇文章描述了XMS和WMQ的优缺点。我需要同时支持JMS和非JMS消息传递。
在启用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>
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读取队列中的所有消息,但是那些不适合我的应用程序的消息被绘制出来。创建一个线程并分别等待答案,在我看来,这似乎不是一个好主意,因为可以有几千个线程。如何成为?