Websphere MQ 中文乱码解决

 

 解决方法:

发送:

MQEnvironment.CCSID = 1381;(在JAVA连接代码时指定一下字符集)

String messageData = "发送数据";

message.writeUTF(messageData );

接收:

MQEnvironment.CCSID = 1381;(在JAVA连接代码时指定一下字符集)

String messageData = message.readUTF(messageData );

 

 

网上的解决方法:

 

 

最近在学习IBM MQ,在网上cope了一段代码,稍作整理,执行了一下,代码如下:

import com.ibm.mq.*;

public class MQJavaProc {

 /**
  * 简单的发送消息程序
  */
 public static void Typesetter() {
  try {

   // 主机名称
   String hostName = "MQHOST"; 
   // 端口(缺省)
//   int port = 1414;
   // 通道名称(缺省)
   String channel = "SYSTEM.DEF.SVRCONN";
   // 队列管理器名称
   String qManager = "QM_PCCS";
   // 队列名称
   String qName = "changzhiyuan";

   // Set up the MQEnvironment properties for Client Connections.
   // 建立MQEnvironment 属性以便客户机连接.
   MQEnvironment.hostname = hostName;
//   MQEnvironment.port = port;
   MQEnvironment.channel = channel;
   MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);

   // Connection To the Queue Manager.
   // 连接到队列管理器.
   MQQueueManager qMgr = new MQQueueManager(qManager);

   /**
    * Set up the open options to open the queue for out put
    * and additionally we have set the option to fail if the queue manager
    * is quiescing.
    * 
    * 建立打开选项以便打开用于输出的队列,进一步而言,如果队列管理器是
    * 停顿的话,我们也已设置了选项去应对不成功情况.
    */
   int penOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;

   // Open the queue.
   // 打开队列.
   MQQueue queue = qMgr.accessQueue(qName, openOptions, null, null,
     null);

   // Set the put message options , we will use the default setting.
   // 设置放置消息选项我们将使用默认设置.
   MQPutMessageOptions pmo = new MQPutMessageOptions();

   /**
    * Next we Build a message The MQMessage class encapsulates the data
    * buffer that contains the actual message data, together with all the MQMD
    * parameters that describe the message. 
    * 
    * 下一步我们建立消息,MQMessage类压缩了包含实际消息数据的数据缓冲区,
    * 和描述消息的所有MQMD 参数.
    * 
    * To Build a new message, create a new instance of MQMessage class
    * and use writxxx (we will be using writeString method). 
    * The put() method of MQQueue also takes an instance of the 
    * MQPutMessageOptions class as a parameter.
    * 
    * 欲建立新消息,创建MQMessage类新实例以及使用writxxx(我们将使用writeString 方法.).
    * MQQueue 的put()方法也可作为参数MQPutMessageOptions 类的实例.
    */

   // Create The message buffer.
   // 创建消息缓冲区.
   MQMessage utMsg = new MQMessage();

   // Set the MQMD format field.
   // 设置MQMD 格式字段.
   outMsg.format = MQC.MQFMT_STRING; 
            

   // Prepare message with user data.
   // 准备用户数据消息.
   String msgString = "HEAD7C5218991310615536   BOCOMC     0100521899        200909170720470020090917101000000022164428000000020000000000000000000000020000  1110408715  0000    0 1564439990000044399900000                          1 1  000                                               DOMN200909170720470016100115400000000156          HA1310011130028738445 AT032007101900000068835700000110000000000000000020090915000000010000000000431643000000000000                       PENG PING          6532CAFCR102                                                                    000281548016372856DQPD        2007100120071030                               000002000000000000000000000068835700000110000000000000000000000001000000000043164300000048411900000010000000620090917072055550                                                                                                                                      19790117                                                               518000          20090917000000272977113714719646         1310710130979       MALE                    SSNO180001016790                             MS0000000000                2007101920090912000000002007103001                  0           00000004841192007102004064394C       000000000           TAIL";

   // Now we put The message on the Queue.
   // 现在我们在队列上放置消息.
   outMsg.writeString(msgString);


   // Commit the transaction.
   // 提交事务处理.
   queue.put(outMsg, pmo);
   qMgr.commit();
   System.out.println(" The message has been Sussesfully put\n\n#########");

   // Close the the Queue and Queue manager objects.
   // 关闭队列和队列管理器对象.
   queue.close();
   qMgr.disconnect();

  } catch (MQException ex) {

   System.out.println("An MQ Error Occurred: Completion Code is :\t" +
   ex.completionCode + "\n\n The Reason Code is :\t" + ex.reasonCode);
   ex.printStackTrace();

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 /**
  * 简单的消息接收器应用程序
  * 
  * 调入MQSeries Java API package 
  * 为客户机连接设置环境属性 
  * 连接到队列管理器 
  * 为打开MQSeries 队列设置选项
  * 为获取消息打开应用程序 
  * 设置选项,从应用程序队列获取消息 
  * 创建消息缓冲区 
  * 从队列获取消息到消息缓冲区 
  * 从消息缓冲区读取用户数据并在控制台上显示
  */
 public static void PtpReceiver() {
  try {
   
   // 主机名称
   String hostName = "MQHOST"; 
   // 端口(缺省)
   //int port = 1414;
   // 通道名称(缺省)
   String channel = "SYSTEM.DEF.SVRCONN";
   // 队列管理器名称
   String qManager = "QM_PCCS";
   // 队列名称
   String qName = "changzhiyuan";

   // 建立MQEnvironment 属性以便客户机连接
   MQEnvironment.hostname = hostName;
   //MQEnvironment.port = port;
   MQEnvironment.channel = channel;
   MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);

   // Connection To the Queue Manager.
   // 连接到队列管理器.
   MQQueueManager qMgr = new MQQueueManager(qManager);

   /**
    * Set up the open options to open the queue for out put and
    * additionally we have set the option to fail if the queue manager
    * is quiescing.
    * 
    * 建立打开选项以便打开用于输出的队列,
    * 进一步而言,如果队列管理器是停顿的话,我们也
    * 已设置了选项去应对不成功情况.
    */

   // Open the queue.
   // 打开队列.
   int penOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING;

   // Set the put message options.
   // 设置放置消息选项.
   MQQueue queue = qMgr.accessQueue(qName, openOptions, null, null, null);

   MQGetMessageOptions gmo = new MQGetMessageOptions();

   // Get messages under sync point control.
   // 在同步点控制下获取消息.
   gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;

   // Wait if no messages on the Queue.
   // 如果在队列上没有消息则等待.
   gmo.options = gmo.options + MQC.MQGMO_WAIT;

   // Fail if QeueManager Quiescing.
   // 如果队列管理器停顿则失败.
   gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;

   // Sets the time limit for the wait.
   // 设置等待的时间限制.
   gmo.waitInterval = 3000; 
   

   /**
    * Next we Build a message The MQMessage class encapsulates the data
    * buffer that contains the actual message data, together with all the MQMD
    * parameters that describe the message.
    * 
    * 下一步我们建立消息,MQMessage
    * 类压缩了包含实际消息数据的数据缓冲区,
    * 和描述消息的所有MQMD 参数.
    */

   // Create the message buffer.
   // 创建消息缓冲区.
   MQMessage inMsg = new MQMessage();

   // Get the message from the queue on to the message buffer.
   // 从队列到消息缓冲区获取消息.
   queue.get(inMsg, gmo);

   // Read the User data from the message.
   // 从消息读取用户数据.
   String msgString = inMsg.readString(inMsg.getMessageLength());
   // 控制台输出
   System.out.println(" The Message from the Queue is : \n\n" + msgString);

   // Commit the transaction.
   // 提交事务处理.
   qMgr.commit();

   // Close the the Queue and Queue manager objects.
   // 关闭队列和队列管理器对象.
   queue.close();
   qMgr.disconnect();

  } catch (MQException ex) {

   System.out.println("An MQ Error Occurred: Completion Code is :\t" +
   ex.completionCode + "\n\n The Reason Code is :\t" + ex.reasonCode);
   ex.printStackTrace();

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  PtpReceiver();
 }

}

 

执行有异常,异常如下:

MQJE001: MQException 出现:完成代码是 2,原因为 2195
MQJE020: 队列管理器不支持 CCSID
MQJE001: MQException 出现:完成代码是 2,原因为 2195
MQJE020: 队列管理器不支持 CCSID
com.ibm.mq.MQException: MQJE001: MQException 出现:完成代码是 2,原因为 2195
MQJE020: 队列管理器不支持 CCSID
        at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:212)
        at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:318)
        at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:338)
        at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:84)
        at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:168)
An MQ Error Occurred: Completion Code is :        2

The Reason Code is :        2195
        at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:772)
        at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:697)
        at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:657)
        at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:153)
        at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:451)
        at com.lijm.test.Typesetter.main(Typesetter.java:26)
Caused by: com.ibm.mqservices.MQInternalException: MQJE001: MQException 出现:完成代码是 2,原因为 2195
MQJE020: 队列管理器不支持 CCSID
        at com.ibm.mq.MQv6InternalCommunications.checkErrorFlags(MQv6InternalCommunications.java:1062)
        at com.ibm.mq.MQv6InternalCommunications.parseInitialDataResponse(MQv6InternalCommunications.java:957)
        at com.ibm.mq.MQv6InternalCommunications.establishChannel(MQv6InternalCommunications.java:662)
        at com.ibm.mq.MQv6InternalCommunications.initialize(MQv6InternalCommunications.java:206)
        at com.ibm.mq.MQv6InternalCommunications.<init>(MQv6InternalCommunications.java:102)
        at com.ibm.mq.MQSESSIONClient.MQCONNX(MQSESSIONClient.java:1337)
        at com.ibm.mq.MQSESSIONClient.MQCONN(MQSESSIONClient.java:1246)
        at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:184)
        ... 10 more

后经查询,问题出在MQ字符集不一致的问题上,原因为 2195 MQJE020: 队列管理器不支持 CCSID。

解决办法:

一:MQEnvironment.CCSID = 1381;(在JAVA连接代码时指定一下字符集)

二:修改字符集设置

一般Unix、Linux平台中MQ默认的字符集为819,而Windows平台为1381,所以你必须改变其字符集,使两边的字符集相同。改变方法:

1.通过DOS进入MQ的安装目录,进入/bin下。假如要更改的队列管理器为A

2.用指令“strmqm A”启动队列管理器A

3.用指令“runmqsc A”启动A的MQSC。

4.运行指令“ALTER QMGR CCSID(819)”“end”则修改字符集为819。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值