network 发表于 2015-10-3 10:06:35

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

  第一次接触WebSphere MQ,C#的程序总是报错,后来改用java写。但发现一个问题,如果接收时用readFully方法接收字符串,消息里的中文会出现乱码,就是将取到的bytes再转码也无济于事。
出现问题的代码:
            int size = rcvMessage.getMessageLength();
            byte[] p = new byte;
            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;
            //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();
      }
    }
}  
页: [1]
查看完整版本: IBM WEBSPHERE MQ 接收消息中文乱码问题的处理