这篇文章用于加深对MQ发送接收信息的理解,有错误之处请评论区予以指点,多谢
首先MQ是用来通信的,所以会有收发消息的双方,我们假设,发送消息的A,与接收消息的B
打开“WebSphere MQ资源管理器”,新建队列管理器,名称为A_dlglq_name(发送端mq队列管理器名称),其余采用默认设置;
在A_dlglq_name(发送端mq队列管理器名称) 队列管理器中创建本地队列,名称为A_bddl_name(发送端mq本地队列名称);
创建传输队列,名称为A_bdcsdl_name(发送端mq本地传输队列名称)(新建时选择“本地队列”,将“用法”设置为“传输”);
创建远程队列定义,名称为A_ycdl_name(发送端mq远程队列名称),指定远程队列名称为B_bddl_name(接收端mq本地队列名称),远程队列管理器名称为B_dlglq_name(接收端mq队列管理器名称),传输队列名称为A_bdcsdl_name(发送端mq本地传输队列名称);
创建发送方通道,名称为A_B(发送端发送消息到接收端的通道名称),传输协议为TCP/IP,连接名称为接收端ip地址(接收端mq的端口) 如172.100.100.1(1234),传输队列为A_bdcsdl_name(发送端mq本地传输队列名称),本地通信地址写本机ip;
创建服务器连接通道,名称为DC.SVRCONN,采用默认设置(该通道主要给后面的测试程序使用)。
找到A_ycdl_name 远程队列,右键选择放入测试消息,在下图位置放入消息
打开“WebSphere MQ资源管理器”,新建队列管理器,名称为B_dlglq_name(接收端mq队列管理器名称),其余采用默认设置;
在B_dlglq_name(接收端mq队列管理器名称)队列管理器中创建本地队列,名称为B_bddl_name(接收端mq本地队列名称);
创建接受方通道,名称为A_B(必须与发送端发送到接收端的通道名称相同),采用默认设置;
创建服务器连接通道,名称为DC.SVRCONN,采用默认设置。
代码:
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
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、双方给对方发的报文都会携带这两个值,如:
即:同一个msrfid代表同一笔交易。
ShyTan原创文章,转载请标明原出处:https://blog.csdn.net/ShyTan/article/details/115756610