IBM MQ 6.0中设置两个队列,(远程队列、通道之类都不设置)。
队列管理器是XIR_QM_1502
队列名称是ESBREQ
IP地址是10.23.117.134(远程的一台电脑,跟我的电脑不在一个局域网内)
端口1414
CCSID 1208
MQ配置可以参考这个,有配图http://wenku.baidu.com/view/06d108d0360cba1aa811daa3.html
程序如下,发送线程两个,接收线程一个。接收完毕后就结束。
/* * 创建日期 2012-7-10 * * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - Java - 代码样式 - 代码模板 */ package yerasel; /** * @author Fenglb E-mail:[email protected] * @version 创建时间:2009-4-30 下午04:13:38 类说明 */ import java.io.IOException; import com.ibm.mq.MQC; import com.ibm.mq.MQEnvironment; import com.ibm.mq.MQException; import com.ibm.mq.MQGetMessageOptions; import com.ibm.mq.MQMessage; import com.ibm.mq.MQPutMessageOptions; import com.ibm.mq.MQQueue; import com.ibm.mq.MQQueueManager; interface SomeConstants { String qManager = "XIR_QM_1502";//"XIR_QM"; //QueueManager name String qName = "ESBREQ";// Queue Name String strIP = "10.23.117.134";//"10.24.28.139";//"10.24.28.102"; int iPort = 1502;//1414; String strChl = "SYSTEM.DEF.SVRCONN";// Server-Connection Channel int iCCSID = 1208; } class Sender implements Runnable, SomeConstants { public void run() { sendMessage(); } public void sendMessage() { String name = Thread.currentThread().getName(); System.out.println("进入线程" + name); MQQueueManager qMgr = null; // configure connection parameters MQEnvironment.hostname = strIP; // Server name or IP MQEnvironment.port = iPort; MQEnvironment.channel = strChl; MQEnvironment.CCSID = iCCSID; // java程序连接mq的方式有两种,一是客户机方式,一是绑定方式, // 默认是客户机方式,当mq部署在本地的时候,就需要用绑定方式 // 本机IP是10.24.28.139连接10.23.117.134的时候不需要下句 //MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, //MQC.TRANSPORT_MQSERIES_BINDINGS); // Create a connection to the QueueManager System.out.println(name + " Connecting to queue manager: " + qManager); try { qMgr = new MQQueueManager(qManager); // Set up the options on the queue we wish to open int openOptions = MQC.MQMT_REQUEST | MQC.MQPMO_NEW_MSG_ID | MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INPUT_AS_Q_DEF; // Now specify the queue that we wish to open and the open options System.out.println(name + " Accessing queue: " + qName); MQQueue queue = qMgr.accessQueue(qName, openOptions); // Define a simple WebSphere MQ Message ... // Specify the default put message options MQPutMessageOptions pmo = new MQPutMessageOptions(); // Put the message to the queue System.out.println(name + " Sending a message..."); MQMessage msg = new MQMessage(); msg.messageId = "MSGID".getBytes(); msg.messageType = MQC.MQMT_REQUEST; msg.replyToQueueName = "ESBREQ"; // 在此测试一下 mq 的传输次列 for (int j = 1; j < 5; j++) { msg.messageSequenceNumber = j; // write some text in UTF8 format try { String str = "Salemetsizbe Yerasel"; str = str + " " + j; msg.writeUTF(str); queue.put(msg, pmo); msg.clearMessage(); System.out.println(name + " putting the message... " + j); } catch (MQException mqe) { mqe.printStackTrace(); break; } catch (IOException e1) { e1.printStackTrace(); } } qMgr.commit(); System.out.println(name + " Done!"); System.out.println("=========="); System.out.println(""); } catch (MQException e) { e.printStackTrace(); } } } class Receiver implements Runnable, SomeConstants { public void run() { recvMessage(); } public void recvMessage() { String name = Thread.currentThread().getName(); try { Thread.sleep(1000); MQQueueManager qMgr = null; System.out.println("进入线程" + name); System.out.println(name + " Connecting to queue manager: " + qManager); qMgr = new MQQueueManager(qManager); // 设置将要连接的队列属性 // Note. The MQC interface defines all the constants used by the // WebSphere MQ Java programming interface // (except for completion code constants and error code constants). // MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the // queue-defined default. // MQOO_OUTPUT:Open the queue to put messages. int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE; // 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(); gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;// Get messages // under sync point // control(在同步点控制下获取消息) gmo.options = gmo.options + MQC.MQGMO_WAIT; // Wait if no messages // on the // Queue(如果在队列上没有消息则等待) gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;// Fail if // Qeue // Manager // Quiescing(如果队列管理器停顿则失败) gmo.waitInterval = 1000; // Sets the time limit for the // wait.(设置等待的毫秒时间限制) System.out.println(name + " Accessing queue: " + qName); MQQueue queue = qMgr.accessQueue(qName, openOptions); int depth = 0; // Get the message off the queue. System.out.println("... " + name + " getting the message back again"); for (;;) { try { queue.get(rcvMessage, gmo); System.out.println(" ID: " + (new String(rcvMessage.messageId)).trim() + " Num: " + rcvMessage.messageSequenceNumber + " Type: " + rcvMessage.messageType + " Flag: " + rcvMessage.messageFlags); // And display the message text... String msgText = rcvMessage.readUTF(); System.out.println("The message is: " + msgText); rcvMessage.clearMessage(); // Break if no MSG left in queue depth = queue.getCurrentDepth(); if (depth == 0) break; } catch (MQException mqe) { mqe.printStackTrace(); break; // null; } catch (IOException e) { e.printStackTrace(); } } // Close the queue System.out.println(name + " Closing the queue"); queue.close(); // Disconnect from the QueueManager System.out.println(name + " Disconnecting from the Queue Manager"); qMgr.disconnect(); System.out.println(name + " Done!"); System.out.println("=========="); System.out.println(""); } catch (MQException ex) { System.out .println("A WebSphere MQ Error occured : Completion Code " + ex.completionCode + " Reason Code " + ex.reasonCode + ex.getMessage()); } catch (InterruptedException e1) { e1.printStackTrace(); } } } public class MQTest { public static void main(String args[]) { /* * MQTest first = new MQTest(); first.sendMessage(); * first.recvMessage(); */ Sender sender = new Sender(); Thread senderThread = new Thread(sender); senderThread.start(); senderThread.setName("Sender"); Thread senderThread2 = new Thread(sender); senderThread2.start(); senderThread2.setName("Sender2"); Receiver recv = new Receiver(); Thread recvThread = new Thread(recv); recvThread.start(); recvThread.setName("Receiver"); // Receiver recv = new Receiver(); // new Thread(recv).start(); } }
运行结果如下:
进入线程Sender2
进入线程Sender
Sender2 Connecting to queue manager: XIR_QM_1502
Sender Connecting to queue manager: XIR_QM_1502
Sender2 Accessing queue: ESBREQ
Sender2 Sending a message...
Sender Accessing queue: ESBREQ
Sender Sending a message...
Sender2 putting the message... 1
Sender putting the message... 1
Sender2 putting the message... 2
Sender putting the message... 2
Sender2 putting the message... 3
Sender putting the message... 3
Sender2 putting the message... 4
Sender putting the message... 4
Sender2 Done!
==========
Sender Done!
==========
进入线程Receiver
Receiver Connecting to queue manager: XIR_QM_1502
Receiver Accessing queue: ESBREQ
... Receiver getting the message back again
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 1
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 1
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 2
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 2
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 3
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 3
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 4
ID: MSGID Num: 1 Type: 1 Flag: 0
The message is: Salemetsizbe Yerasel 4
Receiver Closing the queue
Receiver Disconnecting from the Queue Manager
Receiver Done!
==========