如何使用Apache camel-jms设置JMS_IBM_MQMD_MsgId头?



所以,我有一条消息,我正在通过IBM mq队列发送,我想给它一个自定义的MessageID。为了启用MQMD属性,我已经用以下属性实现了DestinationResolver: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.

首先- MessageId是一个24字节的数组。这就是你的误差。您正在尝试将字符串推入字节数组- [B]。修复此错误后,仍然无法成功设置MessageId。因为MQ将完全忽略消息生成器设置的任何值,并且它将始终用任意值覆盖您的MessageId。

归咎于JMS API。这有点愚蠢,它没有区分终端用户界面和消息驱动程序程序员界面。在javax.jms.Message中有多个setter,这些setter不打算被日常Joe使用。

那么你能做些什么呢?首先,您可以使用不同的字段:Message Type和CorrelationID标头打算由最终用户使用。CorrelationID共享相同的字节[24]设计,并且它在功能上与MessageID相同。通常,CorrelationID是在"相关"的两个不同消息之间共享的,因此是名称。您还可以在消息中添加任意头。

但是如果你真的真的需要知道发送消息的MessageID——因为审计、关联或其他原因——你可以先发送消息,然后读取MessageID字段。它将包含生成的值。

最新更新