IBM MQ运维使用手册(3)

五、测试
    本次测试分三个场景,场景一为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) 

IBM MQ运维使用手册


8.进入mqsc命令模式,在QM1上运行通道

START CHANNLE(C) 

IBM MQ运维使用手册


9.发送报文测试
运行

mqm@mq:~/sh> amqsput QR QM1 

输入“this is a test!”,双击回车结束

IBM MQ运维使用手册

10.接收报文测试
运行

mqm@mq:~/sh> amqsget QL QM2 

ctrl+c结束

测试成功。

2)    测试场景二

概述:向windows下的队列管理器QM3中的远程队列QR发送消息,通过传送队列QX和传输通道C将消息发送至linux下的队列管理器QM2中的本地队列QL。QM2及其队列的创建参照场景一。

1.    在windows上新建队列管理器QM3

创建方式有两种,一种为命令模式,可在dos下输入命令,类似linux;一种为图形化界面,这里主要介绍图形化创建模式。

IBM MQ运维使用手册

如图,“队列管理器”——“新建”——“队列管理器”

IBM MQ运维使用手册

队列名为QM3,下一步

IBM MQ运维使用手册

监听端口自定义,这里取默认值1414,单击完成

2.    新建本地队列QX

IBM MQ运维使用手册

“队列”——“新建”——“本地队列”

IBM MQ运维使用手册

队列名为QX

IBM MQ运维使用手册

使用情况改成“传输”,单击完成,完成队列创建。

3.    新建远程队列QR

IBM MQ运维使用手册

“队列”——“新建”——“远程队列定义”

IBM MQ运维使用手册

队列名为QR,下一步

IBM MQ运维使用手册

远程队列管理器填写linux服务器上的QM2;远程队列为QM2下的本地队列QL,传输队列为windows下QM3的本地队列QX。单击完成,完成队列创建。

4.    创建发送方通道C

IBM MQ运维使用手册

“通道”——“新建”——“发送方通道”

IBM MQ运维使用手册

通道名为C,下一步

IBM MQ运维使用手册

连接名为linux服务器ip地址+队列管理器QM2监听端口,传输队列为本地队列QX,单击完成,完成发送通道创建

5.    启动发送通道C

IBM MQ运维使用手册

6.    放入消息至远程队列QR

IBM MQ运维使用手册

右键队列QR,选择放入测试消息

IBM MQ运维使用手册

写入test,回车

7.    队列管理器QM2中浏览消息

查看队列管理器中消息方式有三种命令,分别是:amqsgbr、amqsbcg和提取命令amqsget,在linux服务器上执行浏览命令,如图,成功接收消息“test”

IBM MQ运维使用手册

3)    测试场景三

概述:通过java程序调用linux下队列管理器QM1相关参数向QM2发送消息,观察QM2下的本地队列是否成功接收消息。QM1和QM2及其队列等的创建参照测试场景一。

1.    导入相关jar包

IBM MQ运维使用手册

下载链接:

所有文件已上传,可以到Linux公社资源站下载:

------------------------------------------分割线------------------------------------------

免费下载地址在

用户名与密码都是

具体下载目录在 /2018年资料/8月/19日/IBM MQ运维使用手册/

下载方法见

------------------------------------------分割线------------------------------------------

2.    配置相关参数和测试消息

IBM MQ运维使用手册

参数配置

IBM MQ运维使用手册

写入测试消息“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”

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8d503d41bc4f1b6004d9e522b3f627f2.html