如何将繁体中文消息从 Java 发送到 IBM MQ
Posted
技术标签:
【中文标题】如何将繁体中文消息从 Java 发送到 IBM MQ【英文标题】:How to send Traditional chinese character message from Java to IBM MQ 【发布时间】: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 【参考方案1】:0051963 MQ 请求失败。 MQ 类型:MQGET MQ 名称:LOADER CC: 00000001 RC: 00002079
原因码 2079 (MQRC_TRUNCATED_MSG_ACCEPTED) 意味着您需要为 MQGET 使用更大的缓冲区。
0051963 MQ 请求失败。 MQ 类型:MQOPEN MQ 名称:ERROR CC: 00000002 RC: 00002035
原因码 2035 (MQRC_NOT_AUTHORIZED) 表示您连接到队列管理器的 UserId 没有打开该特定队列的权限。获取MQAdmin为UserId设置权限,以便开启队列。
0051963 MQ 请求失败。 MQ 类型:MQPUT MQ 名称:错误 CC: 00000002 RC: 00002019
修复安全问题,然后此错误消息将消失。有人没有正确编码他们的应用程序,因为异常(RC of 2035)应该已经被捕获,而不是继续放置消息。
【讨论】:
感谢您的回复。我们无法控制接收应用程序缓冲区的大小。有没有办法在将 msg 发布到 MQ 时指定最大消息缓冲区大小?仅供参考,当前 IBM MQ 最大消息长度为 20,00,000 MQAdmin 是否将通道的最大消息长度更新为至少 20MB?注意:最好将其设置为 100MB(最大值)。此外,您需要让 MQAdmin 修复您的 UserId 权限问题。以上是关于如何将繁体中文消息从 Java 发送到 IBM MQ的主要内容,如果未能解决你的问题,请参考以下文章
IBM MobileFirst 将 JSON 正文从 iOS SDK 发送到 Java 适配器
如何将 Bridge 消息从 Java (Android) 发送到 JavaScript
我们如何跟踪从 IBM MobileFirst 7.0 发送到 Apple APNS 服务器的推送通知?