这篇文章用于加深对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中配置的传输方式TCP和IP端口连接对方
4、根据第二步第三步得到的信息,将消息使用TCP方式通过通道发送到B的IP端口下B的队列管理器中B方本地队列
5、B方自己从本地队列中取数据
二、一般收发报文规则
1、报文中一般存在mesgid(消息标识号)是用来区分交易的唯一标志(每次不同且不重复)
2、还会存在msrfid(消息参考号)用来确认一笔往返报文的唯一值(每笔不同且不重复)
3、双方给对方发的报文都会携带这两个值,如:
- A发送报文时mesgid=0001,msrfid=123
- B接收报文后想进行回执时,会新生成mesgid=M9001,并将A发来的msrfid=123返回
即:同一个msrfid代表同一笔交易。
ShyTan原创文章,转载请标明原出处:https://blog.csdn.net/ShyTan/article/details/115756610