最近在学习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.
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:318)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:338)
at com.ibm.mq.StoredManagedConnection.
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.
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.
at com.ibm.mq.MQSESSIONClient.MQCONNX(MQSESSIONClient.java:1337)
at com.ibm.mq.MQSESSIONClient.MQCONN(MQSESSIONClient.java:1246)
at com.ibm.mq.MQManagedConnectionJ11.
... 10 more
后经查询,问题出在MQ字符集不一致的问题上,原因为 2195 MQJE020: 队列管理器不支持 CCSID。
解决办法:
一:MQEnvironment.CCSID = 1381;(在JAVA连接代码时指定一下字符集)
二:修改字符集设置
一般Unix、Linux平台中MQ默认的字符集为819,而Windows平台为1381,所以你必须改变其字符集,使两边的字符集相同。改变方法:
1.通过DOS进入MQ的安装目录,进入/bin下。假如要更改的队列管理器为A
2.用指令“strmqmA”启动队列管理器A。
3.用指令“runmqscA”启动A的MQSC。
4.运行指令“ALTER QMGR CCSID(819)”“end”则修改字符集为819。
http://www.webspherechina.net/?uid-3-action-viewspace-itemid-49264