五、测试
本次测试分三个场景,场景一为linux服务器上新建两个队列管理器QM1和QM2,QM1向QM2发送消息,观察消息是否正常送达QM2;场景二为windows服务器新建队列管理器QM3,向linux服务器上的QM2发送消息,观察消息是否正常送达QM2;场景三为编写java程序,通过调用QM1的相关参数向QM2发送消息,观察消息是否正常送达QM2。
1) 测试场景一
概述:向队列管理器QM1中的远程队列QR发送消息,通过传送队列QX和传输通道C将消息发送至队列管理器QM2中的本地队列QL。
1.在linux服务器192.168.0.151上新建两个队列管理器QM1和QM2:
mqm@mq:~> crtmqm QM1
mqm@mq:~> crtmqm QM2
2.启动QM1和QM2
mqm@mq:~> strmqm QM1
mqm@mq:~> strmqm QM2
3.建立队列和通道
定义QM1的队列和通道创建脚本(/var/mqm下新建sh目录,在sh目录下创建)
/var/mqm/sh$vi define_qm1.tst
DEFINE QREMOTE (QR) RNAME (QL) RQMNAME (QM2) XMITQ (QX) REPLACE
DEFINE QLOCAL (QX) USAGE (XMITQ) REPLACE
DEFINE CHANNEL (C) CHLTYPE (SDR) TRPTYPE (TCP) CONNAME ('127.0.0.1 (1502)') XMITQ (QX) REPLACE
4.创建QM1的队列和通道:
mqm@mq:~/sh> runmqsc QM1 < define_qm1.tst > out
查看out文件,确认没有错误;
5. 定义qm2的队列和通道创建脚本
/var/mqm/sh$vi define_qm1.tst
DEFINE QLOCAL (QL) REPLACE
DEFINE CHANNEL (C) CHLTYPE (RCVR) TRPTYPE (TCP) REPLACE
6.创建QM2的队列和通道
mqm@mq:~/sh> runmqsc QM2 < define_qm2.tst > out
查看out文件,确认没有错误;
7.进入mqsc命令模式,在QM2上新建并启动监听
DEFINE LISTENER(L2) TRPTYPE(TCP) PORT(1502) CONTROL(QMGR) REPLACE
START LISTENER(L2)
8.进入mqsc命令模式,在QM1上运行通道
START CHANNLE(C)
9.发送报文测试
运行
mqm@mq:~/sh> amqsput QR QM1
输入“this is a test!”,双击回车结束
10.接收报文测试
运行
mqm@mq:~/sh> amqsget QL QM2
ctrl+c结束
测试成功。
2) 测试场景二
概述:向windows下的队列管理器QM3中的远程队列QR发送消息,通过传送队列QX和传输通道C将消息发送至linux下的队列管理器QM2中的本地队列QL。QM2及其队列的创建参照场景一。
1. 在windows上新建队列管理器QM3
创建方式有两种,一种为命令模式,可在dos下输入命令,类似linux;一种为图形化界面,这里主要介绍图形化创建模式。
如图,“队列管理器”——“新建”——“队列管理器”
队列名为QM3,下一步
监听端口自定义,这里取默认值1414,单击完成
2. 新建本地队列QX
“队列”——“新建”——“本地队列”
队列名为QX
使用情况改成“传输”,单击完成,完成队列创建。
3. 新建远程队列QR
“队列”——“新建”——“远程队列定义”
队列名为QR,下一步
远程队列管理器填写linux服务器上的QM2;远程队列为QM2下的本地队列QL,传输队列为windows下QM3的本地队列QX。单击完成,完成队列创建。
4. 创建发送方通道C
“通道”——“新建”——“发送方通道”
通道名为C,下一步
连接名为linux服务器ip地址+队列管理器QM2监听端口,传输队列为本地队列QX,单击完成,完成发送通道创建
5. 启动发送通道C
6. 放入消息至远程队列QR
右键队列QR,选择放入测试消息
写入test,回车
7. 队列管理器QM2中浏览消息
查看队列管理器中消息方式有三种命令,分别是:amqsgbr、amqsbcg和提取命令amqsget,在linux服务器上执行浏览命令,如图,成功接收消息“test”
3) 测试场景三
概述:通过java程序调用linux下队列管理器QM1相关参数向QM2发送消息,观察QM2下的本地队列是否成功接收消息。QM1和QM2及其队列等的创建参照测试场景一。
1. 导入相关jar包
下载链接:
所有文件已上传,可以到Linux公社资源站下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2018年资料/8月/19日/IBM MQ运维使用手册/
------------------------------------------分割线------------------------------------------
2. 配置相关参数和测试消息
参数配置
写入测试消息“Hello 123”
3. 程序模板
package mq;
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;
public class MessageByMQ{
//定义队列管理器和队列的名称
private static String qmName;
private static String qName;
private static MQQueueManager qMgr;
static{
//设置环境:
//MQEnvironment中包含控制MQQueueManager对象中的环境的构成的静态变量,MQEnvironment的值的设定会在MQQueueManager的构造函数加载的时候起作用,
//因此必须在建立MQQueueManager对象之前设定MQEnvironment中的值.
MQEnvironment.hostname="192.168.0.151"; //MQ服务器的IP地址
MQEnvironment.channel="C1"; //服务器连接的通道
MQEnvironment.CCSID=1208; //服务器MQ服务使用的编码1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID)
MQEnvironment.port=1501; //MQ端口
qmName = "QM1"; //MQ的队列管理器名称
qName = "QR"; //MQ远程队列的名称
try {
//定义并初始化队列管理器对象并连接
//MQQueueManager可以被多线程共享,但是从MQ获取信息的时候是同步的,任何时候只有一个线程可以和MQ通信。
qMgr = new MQQueueManager(qmName);
} catch (MQException e) {
// TODO Auto-generated catch block
System.out.println("初使化MQ出错");
e.printStackTrace();
}
}
/**
* 往MQ发送消息
* @param message
* @return
*/
public static int sendMessage(String message){
int result=0;
try{
//设置将要连接的队列属性
// 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.
/*目标为远程队列,所有这里不可以用MQOO_INPUT_AS_Q_DEF属性*/
//int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
/*以下选��可适合远程队列与本地队列*/
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
//连接队列
//MQQueue provides inquire, set, put and get operations for WebSphere MQ queues.
//The inquire and set capabilities are inherited from MQManagedObject.
/*关闭了就重新打开*/
if(qMgr==null || !qMgr.isConnected()){
qMgr = new MQQueueManager(qmName);
}
MQQueue queue = qMgr.accessQueue(qName, openOptions);
//定义一个简单的消息
MQMessage putMessage = new MQMessage();
//将数据放入消息缓冲区
putMessage.writeUTF(message);
//设置写入消息的属性(默认属性)
//MQMessage message = new MQMessage();
//message.format = "MQSTR";
putMessage.format = "MQSTR"; //设置消息格式zl01
MQPutMessageOptions pmo = new MQPutMessageOptions();
//将消息写入队列
queue.put(putMessage,pmo);
queue.close();
}catch (MQException ex) {
System.out.println("A WebSphere MQ error occurred : Completion code "
+ ex.completionCode + " Reason code " + ex.reasonCode);
ex.printStackTrace();
}catch (IOException ex) {
System.out.println("An error occurred whilst writing to the message buffer: " + ex);
}catch(Exception ex){
ex.printStackTrace();
}finally{
try {
qMgr.disconnect();
} catch (MQException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 从队列中去获取消息,如果队列中没有消息,就会发生异常,不过没有关系,有TRY...CATCH,如果是第三方程序调用方法,如果无返回则说明无消息
* 第三方可以将该方法放于一个无限循环的while(true){...}之中,不需要设置等待,因为在该方法内部在没有消息的时候会自动等待。
* @return
*/
public static String getMessage(){
String message=null;
try{
//设置将要连接的队列属性
// 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;
MQMessage retrieve = new MQMessage();
//设置取出消息的属性(默认属性)
//Set the put 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.(设置等待的毫秒时间限制)
/*关闭了就重新打开*/
if(qMgr==null || !qMgr.isConnected()){
qMgr = new MQQueueManager(qmName);
}
MQQueue queue = qMgr.accessQueue(qName, openOptions);
// 从队列中取出消息
queue.get(retrieve, gmo);
message = retrieve.readUTF();
System.out.println("The message is: " + message);
queue.close();
}catch (MQException ex) {
System.out.println("A WebSphere MQ error occurred : Completion code "
+ ex.completionCode + " Reason code " + ex.reasonCode);
}catch (IOException ex) {
System.out.println("An error occurred whilst writing to the message buffer: " + ex);
}catch(Exception ex){
ex.printStackTrace();
}finally{
try {
qMgr.disconnect();
} catch (MQException e) {
e.printStackTrace();
}
}
return message;
}
public static void main(String args[]) {
/*下面两个方法可同时使用,也可以单独使用*/
sendMessage("Hello 123");
//getMessage();
}
}
4. 队列管理器QM2中浏览消息
参照测试场景二中的第7步,队列QL中查看测试消息“Hello 123”