【发布时间】:2021-05-04 17:59:56
【问题描述】:
应用范围:从java应用向IBM MQ发送消息,非java大型机应用消费
问题: 简体中文消息被非java主机应用程序成功消费和处理。而繁体字符 msg 在接收应用程序时失败并出现以下错误。
0051963 MQ Request failed. MQ Type: MQGET MQ Name: LOADER CC: 00000001 RC: 00002079
0051963 MQ Request failed. MQ Type: MQOPEN MQ Name: ERROR CC: 00000002 RC: 00002035
0051963 MQ Request failed. MQ Type: MQPUT MQ Name: ERROR CC: 00000002 RC: 00002019
错误代码 2079 说的截断消息被接受,因此消息接收应用程序失败。
为什么繁体字信息先被截断?什么是 处理时应在 java 中使用正确的编码或 CCSID 有汉字吗?
在 java 应用程序中使用下面的 MQ jar:
<!-- MQ Jars -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>8.0.0.5</version>
</dependency>
将消息发布到 IBM MQ 的 Java 代码。
Integer charSetId = 935;
String senderQ = "queue:///"+queueName+"?CCSID="+charSetId+"&targetClient=1";
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setDeliveryPersistent(false);
jmsTemplate.send(senderQ,new MessageCreator() {
public javax.jms.Message createMessage(javax.jms.Session session) throws JMSException {
TextMessage msg = session.createTextMessage();
try {
msg.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, charSetId);
msg.setStringProperty(WMQConstants.JMS_IBM_UNMAPPABLE_ACTION, "REPLACE");
msg.setText(txt);
} catch (Exception e) {
LOGGER.error(errorLog.getErrorDetail(e), e);
}
return msg;
}
});
【问题讨论】:
-
您的 MQGET 缓冲区有多长?繁体中文字符可能每个字符 2 甚至多达 4 个字节,因此您需要更长的缓冲区来获取消息。
-
@MoragHughson 感谢您的回复。我们无法控制接收应用程序缓冲区的大小。有没有办法在将 msg 发布到 MQ 时指定最大消息缓冲区大小?仅供参考,当前 IBM MQ 最大消息长度为 20,00,000
标签: java character-encoding ibm-mq mainframe cjk