【问题标题】:ActiveMQ - No topic messages received from DurableConsumerActiveMQ - 没有从 DurableConsumer 收到主题消息
【发布时间】:2013-11-24 19:57:50
【问题描述】:

我正在尝试从 ActiveMQ 主题中接收消息。在 Web 控制台中,我看到许多消息在主题中排队,但运行以下代码不会返回任何内容:

IConnectionFactory factory = new ConnectionFactory(new Uri("tcp://localhost:61616?wireformat.version=2"));
using (IConnection connection = factory.CreateConnection())
{
     connection.Start();
     ISession session = connection.CreateSession();
     ActiveMQTopic topic = new ActiveMQTopic("MARKETADAPTERS.ORDERBOOKSNAPSHOT");
     consumer = session.CreateDurableConsumer(topic,"OBSnap",null, false);
     message = (ActiveMQTextMessage)consumer.Receive(TimeSpan.FromSeconds(vTimeOutSecs));
}

任何提示将不胜感激。

【问题讨论】:

    标签: c# .net activemq apache-nms


    【解决方案1】:

    为了让 Durable 订阅能够接收离线时发送的消息,它必须首先在 Broker 上注册。您可以通过创建一个实例来注册它,就像您在给定的代码中所做的那样,然后一旦它离线,通过调用 close() 等发送到它的主题的消息将被存储,以便以后可以读取它们。如果您尚未注册此使用者,则发送到该主题的那些消息将被丢弃。

    您还需要连接的唯一客户端 ID,以便每次重新连接时都可以重新订阅持久主题消费者。

    注册持久主题消费者:

    IConnectionFactory factory = new ConnectionFactory(new Uri("tcp://localhost:61616?wireformat.version=2"));
    using (IConnection connection = factory.CreateConnection())
    {
        connectio.ClientId = "MyClientId";
        connection.Start();
        ISession session = connection.CreateSession();
        ActiveMQTopic topic = new ActiveMQTopic("MARKETADAPTERS.ORDERBOOKSNAPSHOT");
        consumer = session.CreateDurableConsumer(topic,"OBSnap",null, false);
    }
    

    稍后使用消息:

    IConnectionFactory factory = new ConnectionFactory(new Uri("tcp://localhost:61616?wireformat.version=2"));
    using (IConnection connection = factory.CreateConnection())
    {
        connection.ClientId = "MyClientId";
        connection.Start();
        ISession session = connection.CreateSession();
        ActiveMQTopic topic = new ActiveMQTopic("MARKETADAPTERS.ORDERBOOKSNAPSHOT");
        consumer = session.CreateDurableConsumer(topic,"OBSnap",null, false);
        message = (ActiveMQTextMessage)consumer.Receive(TimeSpan.FromSeconds(vTimeOutSecs));
    }
    

    【讨论】:

    • 谢谢,那(几乎)做到了。我发现通过将它作为参数传递给 CreateDurableConsumer 方法(在我的示例中为“OBSnap”)来引用该 ClientId 是不可避免的。奇怪的是,我已经尝试提供 ClientId,但我将它作为参数传递给 ConnectionFactory 方法,但这不起作用。所以显然必须以明确的方式指定。
    • 无法真正解读,因此无法提供任何见解
    • 简而言之,如果我在消费者实例化中指定 ClientId,您的解决方案才有效,就像这样:consumer = session.CreateDurableConsumer(topic,"MyClientId",null, false);
    • 听起来您正在使用 Stomp 客户端,在这种情况下这是有道理的。
    猜你喜欢
    • 2018-08-22
    • 2019-07-30
    • 2019-01-27
    • 2013-08-13
    • 1970-01-01
    • 2021-12-10
    • 2016-10-05
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多