IBM 字符集 Header 导致异常

IBM Character Set Header Causing Exceptions

我们有一个 Spring 集成流,它使用来自 Websphere MQ 管理器 queue 的消息。这些消息经过一个简单的过程,然后被放入另一个 queue(在同一个 MQ 管理器中)。

当我们尝试将消息写入最终目的地 queue 时,出现以下错误:

Caused by: javax.jms.JMSException: MQJMS1006: invalid value for 'JMS_IBM_Character_Set': 'IBM850'.
        at com.ibm.msg.client.wmq.v6.jms.internal.ConfigEnvironment.newException(ConfigEnvironment.java:431) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.sendInternal(MQMessageProducer.java:1153) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.send(MQMessageProducer.java:779) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.send(MQMessageProducer.java:2718) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.sendMessage(JmsMessageProducerImpl.java:907) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.send_(JmsMessageProducerImpl.java:762) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.send(JmsMessageProducerImpl.java:393) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at com.ibm.mq.jms.MQMessageProducer.send(MQMessageProducer.java:333) ~[com.ibm.mqjms-7.0.1.3.jar:7.0.1.3 - k701-103-100812]
        at org.springframework.jms.connection.CachedMessageProducer.send(CachedMessageProducer.java:181) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:636) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:607) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.doInJms(JmsTemplate.java:584) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:580) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:706) ~[spring-jms-4.2.1.RELEASE.jar:4.2.1.RELEASE]
        at org.springframework.integration.jms.JmsSendingMessageHandler.send(JmsSendingMessageHandler.java:145) ~[spring-integration-jms-4.2.0.RELEASE.jar:?]
        at org.springframework.integration.jms.JmsSendingMessageHandler.handleMessageInternal(JmsSendingMessageHandler.java:115) ~[spring-integration-jms-4.2.0.RELEASE.jar:?]
        at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) ~[spring-integration-core-4.2.0.RELEASE.jar:?]

我们从最初的 queue 中获取的消息具有以下 IBM-Specific headers:

JMS_IBM_Character_Set=IBM850,
JMS_IBM_MQMD_CodedCharSetId=850,
JMS_IBM_Encoding=17,
JMS_IBM_PutApplType=11,
JMS_IBM_Format=        ,
JMSXDeliveryCount=1,
JMS_IBM_PutTime=12534150,
JMS_IBM_MsgType=8

当我们尝试将处理后的消息写入最终的 Websphere MQ 时,它们仍然存在 Queue。

该项目正在使用以下 IBM MQ 依赖项 jar:

compile 'com.ibm:com.ibm.mq:7.0.1.3'
compile 'com.ibm:com.ibm.mqjms:7.0.1.3'
compile 'com.ibm:com.ibm.mq.jmqi:7.0.1.3'
compile 'com.ibm:com.ibm.mq.headers:7.0.1.3'

解决这个异常的正确方法是什么?我们应该:

  1. 在写入之前从邮件中删除任何 JMS_IBM_XXX headers 到最终的 Websphere MQ Queue?
  2. 使用不同版本的 jar?
  3. 完全做其他事情?

我们似乎没有在从 Websphere MQ queue 获取消息并最终将它们写入另一个 Websphere MQ queue.

的任何其他流程中遇到此问题

引用 WebSphere MQ 7.5 - MS_IBM_Character_Set:

Prior to WebSphere® MQ V7.5, applications using WebSphere MQ messaging provider migration mode could set the JMS_IBM_Character_Set property of a message to a numerical Coded Character Set Identifier.

When the message was sent, the Coded Character Set Identifier stored in the JMS_IBM_Character_Set property was mapped to the MQMD field CodedCharacterSetID.

When using the WebSphere MQ V7.5 classes for JMS, a JMSException containing the message:

MQJMS1006: invalid value for 'JMS_IBM_Character_Set': '<number>'

is thrown if an application tries to send a message that has the JMS_IBM_Character_Set property set to a numerical Coded Character Set Identifier.

The JMS_IBM_Character_Set property must be set to the Java character set string that maps to the Coded Character Set Identifier that the application wants to use. For more information, see Mapping JMS fields onto WebSphere MQ fields (outgoing messages)

由于您使用的是 7.0.1.3 版本,而不是 7.5 或更高版本,因此该值必须是 "数字 Coded Character Set Identifier",这意味着它应该是 850(数字),而不是 IBM850.

在 7.5 版本中应该是 IBM850