如何将繁体中文消息从 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 服务器的推送通知?

如何从 Java REST servlet 向 Angular 客户端发送注销消息?

IBM websphere MQ 消息发送与获取

如何将midi从java程序发送到OSX上的IAC总线