MSMQ创建队列(本地):
专用队列 - 新建 - 专用队列 - 队列名称:MessageQueuing - 勾选事务性
环境配置:
首先需要下载配置文件:https://download.csdn.net/download/qq_24950043/11662752
CSDN的文章:https://blog.csdn.net/qq_24950043/article/details/100529486
调试结果:
1.文章中说前三个文件需要放到jre的bin目录下,但我经过反复测试发现并不需要
2.第一个文件需要放到C:\Windows\System32下,我是64位系统,和文章中说的有出入
3.需要在项目下建个lib把第四个jar文件引入,这个没毛病
4.队列权限,发送消息经过我测试不管是本地还是远端,都不需要配置
发送代码:
package com.queuing;
import ionic.Msmq.Message;
import ionic.Msmq.MessageQueueException;
import ionic.Msmq.Queue;
public class TestMessage {
//192.168.125.116为本机的IP地址(经测试不能使用127.0.0.1,不然会报错)private$\\MessageQueuing是队列名字
static String fullname="direct=tcp:192.168.125.116\\private$\\MessageQueuing";
public static void main(String[] args) {
send();
}
/**
* 发送
*/
public static void send() {
try {
// 参数1:队列地址;参数2:队列类型 1接收、2发送;参数3:是否事务性
Queue queue= new Queue(fullname,2,true);
//标题
String label="testmessage";
//内容
String body= "45634";
//消息头的一个属性,用于关联标识某一特定消息
String correlationId = "12334";
//创建消息
// 参数1:标签;参数2:id;参数3:发送内容
Message msg= new Message(body, label, correlationId);
//发送
queue.send(msg);
//关闭
queue.close();
System.out.println("发送成功");
} catch (Exception e) {
System.out.println("发送失败");
}
}
}
消费代码:
package com.queuing;
import ionic.Msmq.Message;
import ionic.Msmq.MessageQueueException;
import ionic.Msmq.Queue;
public class TestMessage {
//192.168.125.116为本机的IP地址(经测试不能使用127.0.0.1,不然会报错)private$\\MessageQueuing是队列名字
static String fullname="direct=tcp:192.168.125.116\\private$\\MessageQueuing";
public static void main(String[] args) {
receive();
}
/**
* 接收
* @throws Exception
*/
public static void receive(){
try {
Queue receiveQueue = new Queue(fullname,1,true);
//Queue receiveQueue = new Queue(fullname); 这样写也可以拿到队列
// 接收后删除该条消息
Message message = receiveQueue.receive();
//Message message = receiveQueue.peek(); 接收后不删除该条消息
System.out.println("接收内容");
// 获取标签
System.out.println(message.getLabel());
// 获取ID
System.out.println(message.getCorrelationId());
// 获取内容
System.out.println(message.getMessage());
//关闭
receiveQueue.close();
}
catch (MessageQueueException ex1) {
System.out.println("队列为空");
ex1.printStackTrace();
} catch (Exception e) {
System.out.println("队列报错");
e.printStackTrace();
}
}
}
以上是正常情况,那么不正常的情况:
修改发送的ip,这个ip是我随便写的
//192.168.125.116为本机的IP地址(经测试不能使用127.0.0.1,不然会报错)private$\\MessageQueuing是队列名字
static String fullname="direct=tcp:192.168.125.999\\private$\\MessageQueuing";
这时传出队列里出现了条记录,1条消息没发送出去,状态是正在等待连接,因为这个ip本来就不存在
这里是给举个例子,若出现问题了,可以在这个进行查看分析
目前遇到的问题有有以下几种:
1.正在等待连接
2.不活动 连接 Winsock 套接字失败。 地址: IP=…
3.正在等待连接 未安装 TCP 或未启用 TCP
MSMQ创建队列(远端):
现在另一台电脑进行消息发送,代码中的发送ip改为119结尾,队列名称:Message
static String fullname="direct=tcp:192.168.125.119\\private$\\Message";
查看发送消息的电脑上MSMQ的传出队列记录信息:状态已连接,连接可以传递
现在再来查看远端MSMQ接收的Message队列,消息已经接收到了
现在在来测试远端消费,但结果直接报错,我找到了一个文章
文章链接:https://blog.csdn.net/weixin_41969980/article/details/86649983
配置内容:
1.右击消息队列 - 属性 - 服务器安全性 - 取消掉所有的勾选项
2.队列权限,三个都配置
3.注册表
在security下增加AllowNonauthenticatedRpc和NewRemoteReadServerDenyWorkgroupClient,值都是1
配置完成,再次消费测试,结果还是报错。
目前的情况是可以本地发送接收,远端只能发送,并且远端发送的必要条件是本机也必须有MSMQ,也就是说必须在Win系统上才能交互,Linux是没办法进行这种操作的。