IBM WEBSPHERE MQ 接收消息中文乱码问题的处理

第一次接触WebSphere MQ,C#的程序总是报错,后来改用java写。但发现一个问题,如果接收时用readFully方法接收字符串,消息里的中文会出现乱码,就是将取到的bytes再转码也无济于事。字符集也设了,仍然是乱码。
出现问题的代码:
            int size = rcvMessage.getMessageLength();
            byte[] p = new byte[size];
            rcvMessage.readFully(p);
费了半天劲,最后在IBM论坛上找到了解决方法。就是发送和接收都用Object。
完整发送代码:

import  com.ibm.mq. * ;
import  java.util.Hashtable;


public   class  MQSendMessageUtil  {
    public MQSendMessageUtil() {
        try {
            jbInit();
        }
 catch (Exception ex) {
            ex.printStackTrace();
        }

    }


               // define MQ Server Host Name
        private static final String hostname = "192.168.19.2";

        // define MQ Queue Manager Listen Port
        private static final String port = "1414";

        private static final String channel = "S_mq";

        private static final String transport = "MQSeries";

        // define the name of the QueueManager
        private static final String qManager = "QM_mq";

        // and define the name of the Queue
        private static final String qName = "Example";

        public static void sendMessage(Object object) throws Exception {

                MQQueueManager qMgr = null;

                try {

                        // Create a connection to the QueueManager
                        Hashtable properties = new Hashtable();

                        properties.put("hostname", hostname);
                        properties.put("transport", transport);
                        properties.put("channel", channel);
                        properties.put("port", new Integer(Integer.parseInt(port)));
                        properties.put("CCSID", new Integer(1381));

                        qMgr = new MQQueueManager(qManager, properties);

                        // Set up the options on the queue we wish to open
                        int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

                        // Now specify the queue that we wish to open and the open options

                        MQQueue queue = qMgr.accessQueue(qName, openOptions);

                        // Define a simple WebSphere MQ Message 
                        MQMessage msg = new MQMessage();

                        msg.writeObject(object);
                        // Specify the default put message options
                        MQPutMessageOptions pmo = new MQPutMessageOptions();

                        // Put the message to the queue
                        queue.put(msg, pmo);

                        queue.close();

                        // Disconnect from the QueueManager

                        // qMgr.disconnect();

                }
 catch (MQException ex) {
                        ex.printStackTrace();
                }
 catch (java.io.IOException ex) {

                        ex.printStackTrace();
                }
 finally {
                        qMgr.disconnect();
                }

        }


        public static void main(String[] args)
        {
                try
                {
                        MQSendMessageUtil.sendMessage("MQ_sys_msg");
                }

                catch(Exception e)
                {
                        e.printStackTrace();
                }

                System.out.println("MQ_sys_msg");
        }


    private void jbInit() throws Exception {
    }


}

完整的接收代码:

import  com.ibm.mq. * ;
import  java.util.Hashtable;

public   class  MQReceiveMessageUtil  {

    // define MQ Server Host Name
    private static final String hostname = "192.168.19.2";

    // define MQ Queue Manager Listen Port
    private static final String port = "1414";

    private static final String channel = "S_mq";

    private static final String transport = "MQSeries";

    // define the name of the QueueManager
    private static final String qManager = "QM_mq";

  public static Object receiveMessage(String queueName) throws Exception {    
        MQQueueManager qMgr = null;

        try {
            Hashtable properties = new Hashtable();

            properties.put("hostname", hostname);
            properties.put("transport", transport);
            properties.put("channel", channel);
            properties.put("port", new Integer(Integer.parseInt(port)));
            properties.put("CCSID", new Integer(1381));

            //pw.println("Connecting to queue manager: "+qManager+"<br>");
            qMgr = new MQQueueManager(qManager, properties);

            // Set up the options on the queue we wish to open
            int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

            // Now specify the queue that we wish to open and the open options
            //pw.println("Accessing queue: "+qName+"<br>");
            MQQueue queue = qMgr.accessQueue(queueName, openOptions);

            // Now get the message back again. First define a WebSphere MQ message
            // to receive the data
            MQMessage rcvMessage = new MQMessage();

            // Specify default get message options
            MQGetMessageOptions gmo = new MQGetMessageOptions();

            queue.get(rcvMessage, gmo);

            //int size = rcvMessage.getMessageLength();
            //byte[] p = new byte[size];
            //rcvMessage.readFully(p);
            
            Object obj = rcvMessage.readObject();
            queue.close();

            qMgr.disconnect();
            //return p;
            return obj;
            
        }
 catch (MQException ex) {
            ex.printStackTrace();
            return null;
        }
 catch (java.io.IOException ex) {
            ex.printStackTrace();
            return null;
        }

        finally
        {
            qMgr.disconnect();
        }

    }


    public static void main(String[] args)
    {
        try
        {
            String _str = new String(MQReceiveMessageUtil.receiveMessage("Example"));
            System.out.print(_str);

        }

        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值