You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ Artemis与.NET Core NMS监听器无法持续监听队列问题

问题分析与解决

你的监听器无法持续监听队列的核心原因是资源被提前释放,同时代码存在未定义变量的无效逻辑,具体问题和修复方案如下:

1. 核心问题:资源被立即销毁

你的Receive方法中,IConnection、ISession、IMessageConsumer都被包裹在using语句块中。当方法执行到末尾时,这些资源会被自动释放(连接关闭、会话销毁、消费者终止),此时监听器已不存在,自然无法接收后续发送的消息。

2. 次要问题:无效的变量判断

代码里的message变量未声明、未赋值,直接执行if (message == null)判断会导致编译错误,这部分逻辑完全无效。

修复后的消费者代码

要实现持续监听,需让连接、会话、消费者保持活跃,不能在方法结束时就释放。调整后的代码如下:

public void Receive(string queue)
{
    IConnectionFactory factory = new NMSConnectionFactory(ServerUri);
    // 移除using块,手动管理资源生命周期,确保监听期间资源不被释放
    IConnection connection = factory.CreateConnection(Username, Password);
    ISession session = connection.CreateSession();
    IDestination destination = SessionUtil.GetDestination(session, queue);
    IMessageConsumer consumer = session.CreateConsumer(destination);

    // 启动连接以接收消息
    connection.Start();

    // 注册消息监听器
    consumer.Listener += message =>
    {
        if (message is ITextMessage textMessage)
        {
            Console.WriteLine($"Received message ID: {textMessage.NMSMessageId}");
            Console.WriteLine($"Received message text: {textMessage.Text}");
        }
        else
        {
            Console.WriteLine("Received non-text message");
        }
    };

    // 阻塞主线程,防止程序退出,保持监听状态
    Console.WriteLine("Listening for messages... Press any key to exit.");
    Console.ReadKey();

    // 主动释放资源(按需执行)
    consumer.Close();
    session.Close();
    connection.Close();
}

关键调整说明

  • 移除using块,手动控制资源释放时机,确保监听期间连接、会话、消费者处于活跃状态。
  • 添加阻塞逻辑(如Console.ReadKey()),避免方法执行完毕后程序直接退出。
  • 修复监听器内的消息处理逻辑,正确识别消息类型并提取内容。
  • 删除无效的message变量判断代码。

额外提示

  • 若为控制台程序,需保证主线程不提前退出;若为服务类项目,需将连接等资源托管在服务生命周期内。
  • 你的生产者代码逻辑正常,只要消费者保持活跃,就能接收新发送的消息。

内容的提问来源于stack exchange,提问作者Joel Dinis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:58:14