Mq配置归
网上收集的,自己整理了一下。
1. 基础环境
计算机A: computer1 ,IP地址为:10.1.1.1
计算机B: computer2 ,IP地址为:10.1.1.2
分别在两台计算机上安装MQ
2. 创建MQ对象
每一个WMS MQ 至少需要创建一个本地队列、一个远程队列、一个传输队列、一个发送通道、一个接收通道,并且所有WMS MQ上的队列管理器共享同一个服务器连接通道(并且A的接收通道名=B的发送通道名称、A的发送通道名称=B的接收通道名称)。
l 计算机A:
打开“WebSphere MQ资源管理器”,新建队列管理器,名称为A_QueueManager,其余采用默认设置;
Ø 创建队列
1. 创建本地队列:在A_QueueManager队列管理中创建本地队列,名称为A _LocalQueue;
2. 创建远程队列:名称为A _TransmissionQueue.新建时选择“本地队列”,并将“用法”设置为“传输”;
3. 创建远程队列:名称为A_RemoteQueue,设置远程队列名称为B_LocalQueue(计算机B的本地队列),传输队列名称为A_TransmissionQueue(即上一步创建的传输队列)。
Ø 创建通道
1. 创建发送方通道:名称为A.B,传输协议为TCP/IP,连接名称为10.1.1.2(1414),传输队列为A_TransmissionQueue(即创建队列第2步创建的传输队列);
2. 创建接受方通道:名称为B.A,采用默认设置;
3. 创建服务器连接通道:名称为ServerConnChannel.采用默认设置。
l 计算机A:
打开“WebSphere MQ资源管理器”,新建队列管理器,名称为B_QueueManager,其余采用默认设置;
Ø 创建队列
1. 创建本地队列:在B_QueueManager队列管理中创建本地队列,名称为B _LocalQueue;
2. 创建远程队列:名称为B _TransmissionQueue.新建时选择“本地队列”,并将“用法”设置为“传输”;
3. 创建远程队列:名称为B_RemoteQueue,设置远程队列名称为A_LocalQueue(计算机A的本地队列),传输队列名称为B_TransmissionQueue(即上一步创建的传输队列)。
Ø 创建通道
1. 创建发送方通道:名称为B.A,传输协议为TCP/IP,连接名称为10.1.1.1(1414),传输队列为B_TransmissionQueue(即创建队列第2步创建的传输队列);
2. 创建接受方通道:名称为A.B,采用默认设置;
3. 创建服务器连接通道:名称为ServerConnChannel.采用默认设置。
3. 消息测试
在A和B上分别启动发送方通道,正常情况通道状态应该为“正在运行”。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
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;
/**
* A的发送程序和B的接收程序
* @author Administrator
*
*/
public class AQueueManager {
void sender() {
try {
String hostName = "10.1.1.1";
String channel = "ServerConnChannel
String qManager = "A_QueueManager";
String remoteQueue = "A_RemoteQueue";
int port = 1414;
//建立MQEnvironment属性以便客户机连接
MQEnvironment.hostname = hostName;
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQEnvironment.CCSID = 1381;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,
MQC.TRANSPORT_MQSERIES);
// 连接到队列管理器
MQQueueManager qMgr = new MQQueueManager(qManager);
/*
* 建立打开选项以便打开用于输出的队列,进一步而言,如果队列管理器是
* 停顿的话,我们也已设置了选项去应对不成功情况。
*/
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
//打开队列
MQQueue queue = qMgr.accessQueue(remoteQueue, openOptions, null, null,null);
// 设置放置消息选项我们将使用默认设置。)
MQPutMessageOptions pmo = new MQPutMessageOptions();
/*
*下一步我们建立消息,MQMessage类压缩了包含实际消息数据的数据缓冲区,
*和描述消息的所有MQMD 参数.欲建立新消息,创建MQMessage 类新
* 实例以及使用writxxx方法 。MQQueue 的put()方法也可作
* 为参数MQPutMessageOptions 类的实例。)
*/
MQMessage outMsg = new MQMessage(); // Create The message
//创建消息缓冲区
outMsg.format = MQC.MQFMT_STRING; // Set the MQMD format
// 设置MQMD 格式字段
// 准备用户数据消息
String path = "d:/shd.xml";
SAXBuilder sax = new SAXBuilder();
Document document = sax.build(new FileInputStream(path));
StringWriter out = new StringWriter();
XMLOutputter XMLOut = new XMLOutputter(Format.getPrettyFormat()
.setEncoding("GBK"));
XMLOut.output(document, out);
outMsg.writeUTF(out.toString());
// Now we put The message on the Queue(现在我们在队列上放置消息)
queue.put(outMsg, pmo);
// Commit the transaction.(提交事务处理)
qMgr.commit();
System.out.println(" The message has been Sussesfully put!");
// 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();
}
}
public void receiver() {
try {
String hostName = "10.1.1.2";
String channel = " ServerConnChannel ";
String qManager = " B_QueueManager";
String localQueue = "B _LocalQueue";
int port = 1415;
// 建立MQEnvironment 属性以便客户机连接
MQEnvironment.hostname = hostName;
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,
MQC.TRANSPORT_MQSERIES);
//连接到队列管理器
MQQueueManager qMgr = new MQQueueManager(qManager);
/*
* 建立打开选项以便打开用于输出的队列,进一步而言,
*如果队列管理器是停顿的话,我们也已设置了选项去应对不成功情况。
*/
int openOptions = MQC.MQOO_INPUT_SHARED|
MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_INQUIRE ;
// 打开队列
MQQueue queue = qMgr.accessQueue(localQueue, openOptions, null, null,null);
//设置放置消息选项
MQGetMessageOptions getMsgOpt = new MQGetMessageOptions();
getMsgOpt.options = getMsgOpt.options + MQC.MQGMO_SYNCPOINT; // Get messages
// 在同步点控制下获取消息)
getMsgOpt.options = getMsgOpt.options + MQC.MQGMO_WAIT; // Wait if no messages
//如果在队列上没有消息则等待
getMsgOpt.options = getMsgOpt.options + MQC.MQGMO_FAIL_IF_QUIESCING; // Fail
// 如果队列管理器停顿则失败
getMsgOpt.waitInterval = 3000;
// 设置等待的时间限制
/*
* 下一步我们建立消息,MQMessage类压缩了包含实际消息数据的数据缓冲区,
* 和描述消息的所有MQMD 参数)
*/
MQMessage inMsg = new MQMessage(); // Create the message
// 创建消息缓冲区
int depth = queue.getCurrentDepth();
System.out.println("queue depth is:"+queue.getCurrentDepth());
//将队列的里的消息读出来
while(depth-->0) {
MQMessage msg = new MQMessage();// 要读的队列的消息
MQGetMessageOptions gmo = new MQGetMessageOptions();
queue.get(msg, gmo);
System.out.println("消息的大小为:"+msg.getDataLength());
System.out.println("消息的内容:/n"+msg.readUTF());
System.out.println("---------------------------");
}
// 提交事务处理
qMgr.commit();
// 关闭队列和队列管理器对象
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();
}
}s
public static void main(String args[]) {
ZlglQueueManager queueManager = new ZlglQueueManager();
queueManager.sender();
//queueManager.receiver();
}
}