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