因此,我有一个消息,我正在通过IBM mq队列发送,我想给予它一个自定义的MessageID。我已经实现了DestinationResolver,具有以下属性,以便启用MQMD属性:queue.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
我可以设置JMS_IBM_MQMD_ApplIdentityData
头,但我很难设置JMS_IBM_MQMD_MsgId
头。
这是我尝试设置的MessageID:String messageID = "ID:TESTYTEST";
如果我像这样设置JMS_IBM_MQMD_MsgId
:message.setAttribute("JMS_IBM_MQMD_MsgId", messageID.getBytes());
然后我得到下面的错误org.apache.camel.component.jms.JmsBinding - Ignoring non primitive header: JMS_IBM_MQMD_MsgId of class: [B
但是,如果像这样设置JMS_IBM_MQMD_MsgId
:message.setAttribute("JMS_IBM_MQMD_MsgId", messageID);
然后我得到下面的错误com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0051: The property 'JMS_IBM_MQMD_MsgId' should be set using type '[B', not 'java.lang.String'. JMS_IBM properties may only be set using a specific variable type. Correct application code to use the required variable type when setting this JMS_IBM property.
1条答案
按热度按时间yi0zb3m41#
首先- MessageId是一个24字节的数组。这是你的错误。你试图在字节数组- [B中推送String。一旦你修复了这个错误,你仍然无法成功设置MessageId。因为MQ将完全忽略消息生产者设置的任何值,并且它总是用任意值覆盖你的MessageId。
都怪JMS API,它有点白痴,它没有区分最终用户界面和消息驱动程序界面,javax.jms.Message上有不止一个setter,这不是日常Joe想要使用的。
那么你能做些什么呢?首先,你可以使用不同的字段:Message Type和CorrelationID头是供最终用户使用的。CorrelationID共享相同的字节[24]设计,功能上与MessageID相同。通常,CorrelationID在“相关”的几个不同消息之间共享,因此名称。您也可以向消息添加任意头。
但是如果你真的需要知道发送消息的MessageID-因为审计,相关性或其他原因-你可以先发送消息,然后读取MessageID字段。它将包含生成的值。