欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

搞定 MSMQ!消息的发送、接收和避免陷阱——在本地创建队列

最编程 2024-08-06 17:49:12
...

  专用队列 - 新建 - 专用队列 - 队列名称:MessageQueuing - 勾选事务性
在这里插入图片描述
  环境配置:

  首先需要下载配置文件:https://download.****.net/download/qq_24950043/11662752

  ****的文章:https://blog.****.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

推荐阅读