IBM Websphere mq消息队列的理解

这篇文章用于加深对MQ发送接收信息的理解,有错误之处请评论区予以指点,多谢

*MQ配置

一、双方定义

首先MQ是用来通信的,所以会有收发消息的双方,我们假设,发送消息的A与接收消息的B

二、A方配置(发送方)

1、新建队列管理器

打开“WebSphere MQ资源管理器”,新建队列管理器,名称为A_dlglq_name(发送端mq队列管理器名称),其余采用默认设置;

2、创建本地队列

A_dlglq_name(发送端mq队列管理器名称) 队列管理器中创建本地队列,名称为A_bddl_name(发送端mq本地队列名称);

3、创建本地传输队列

创建传输队列,名称为A_bdcsdl_name(发送端mq本地传输队列名称)(新建时选择“本地队列”,将“用法”设置为“传输”);

4、创建远程队列

创建远程队列定义,名称为A_ycdl_name(发送端mq远程队列名称),指定远程队列名称为B_bddl_name(接收端mq本地队列名称),远程队列管理器名称为B_dlglq_name(接收端mq队列管理器名称),传输队列名称为A_bdcsdl_name(发送端mq本地传输队列名称);

5、创建发送方通道

创建发送方通道,名称为A_B(发送端发送消息到接收端的通道名称),传输协议为TCP/IP,连接名称为接收端ip地址(接收端mq的端口) 如172.100.100.1(1234),传输队列为A_bdcsdl_name(发送端mq本地传输队列名称),本地通信地址写本机ip;

6、创建服务器连接通道

创建服务器连接通道,名称为DC.SVRCONN,采用默认设置(该通道主要给后面的测试程序使用)。

7、A端发送消息

找到A_ycdl_name 远程队列,右键选择放入测试消息,在下图位置放入消息

IBM Websphere mq消息队列的理解_第1张图片

三、B方配置(接收方)

1、新建队列管理器

打开“WebSphere MQ资源管理器”,新建队列管理器,名称为B_dlglq_name(接收端mq队列管理器名称),其余采用默认设置;

2、创建本地队列

B_dlglq_name(接收端mq队列管理器名称)队列管理器中创建本地队列,名称为B_bddl_name(接收端mq本地队列名称);

3、创建接受方通道,

创建接受方通道,名称为A_B(必须与发送端发送到接收端的通道名称相同),采用默认设置;

4、创建服务器连接通道

创建服务器连接通道,名称为DC.SVRCONN,采用默认设置。

5、客户端读取消息代码及jar包(非固定,可使用厂商提供版本)

代码:

import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

public class IBMQRead {
	/** 变量 */
	private final static int OPENOPTIONS = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
	static{
		MQEnvironment.hostname = "192.168.0.158";
		MQEnvironment.channel = "DC.SVRCONN";
		MQEnvironment.port = 1414;
		MQEnvironment.CCSID = 1381;
	}

	public static void main(String[] args) {
		try {
			//初始化
			MQQueueManager queueManager = new MQQueueManager("khd_dlgl_name");//队列管理器名称
			//  队列名称
			MQQueue mqQueue = queueManager.accessQueue("khd_bddl_name", OPENOPTIONS, null, null, null);
			//获取管道深度
			int currentDepth = mqQueue.getCurrentDepth();
			
			//进行遍历管道中的所有数据内容
			while(currentDepth-- > 0){
				// 要读的队列的消息
				MQMessage mqMessage = new MQMessage();
				mqQueue.get(mqMessage);
				int dataLength = mqMessage.getDataLength();
				//得到字符串
				String readXml = mqMessage.readStringOfByteLength(dataLength);
				System.out.println(readXml);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

jar包:

        
        
            com.ibm.mq
            jmqi
            7.5
        

        
            com.ibm.mq
            headers
            7.5
        

        
            com.ibm
            mq
            7.5
        

        
            com.ibm.mq
            jms
            7.5
        

        
            com.ibm.mq
            dhbcore
            7.5
        

        
            com.ibm
            mqjms
            7.5
        

        
            com.ibm.mq
            connector
            7.5
        

        
            com.ibm.mq
            commonservices
            7.5
        

*MQ消息流转

一、消息流转目标方向:A--->B详解

1、从A方定义的远程队列A_ycdl_name放入消息

2、根据A_ycdl_name 的配置找到本地传输队列A_bdcsdl_name,确定B方的队列管理器B_dlglq_name和本地队列名B_bddl_name

3、根据拥有A_bdcsdl_name的发送方通道A_B中配置的传输方式TCPIP端口连接对方

4、根据第二步第三步得到的信息,将消息使用TCP方式通过通道发送到B的IP端口B的队列管理器B方本地队列

5、B方自己从本地队列中取数据

二、一般收发报文规则

1、报文中一般存在mesgid(消息标识号)是用来区分交易的唯一标志(每次不同且不重复)

2、还会存在msrfid(消息参考号)用来确认一笔往返报文的唯一值(每笔不同且不重复)

3、双方给对方发的报文都会携带这两个值,如:

  • A发送报文时mesgid=0001msrfid=123
  • B接收报文后想进行回执时,会新生成mesgid=M9001,并将A发来的msrfid=123返回

即:同一个msrfid代表同一笔交易。

ShyTan原创文章,转载请标明原出处:https://blog.csdn.net/ShyTan/article/details/115756610

你可能感兴趣的:(通信)