2.MSMQ 消息发送&接收&避坑

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是没办法进行这种操作的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值