第一次接触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
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);