IBM Websphere mq消息队列的理解

本文详细介绍了WebSphere MQ的配置过程,包括发送方A和接收方B的队列管理器、本地队列、传输队列、远程队列、通道的创建。并展示了Java代码如何从MQ读取消息。同时,解释了MQ消息从A到B的流转步骤,强调了消息标识号和消息参考号在交易确认中的作用。
摘要由CSDN通过智能技术生成

这篇文章用于加深对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 远程队列,右键选择放入测试消息,在下图位置放入消息

三、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包:

        <!-- IBMMQ -->
        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>jmqi</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>headers</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm</groupId>
            <artifactId>mq</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>jms</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>dhbcore</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm</groupId>
            <artifactId>mqjms</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>connector</artifactId>
            <version>7.5</version>
        </dependency>

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>commonservices</artifactId>
            <version>7.5</version>
        </dependency>

*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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShyTan

喜欢的给点打赏呗,纯手打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值