ActiveMQ - 没有从DurableConsumer收到的主题消息

时间:2013-11-12 15:23:25

标签: c# .net activemq apache-nms

我正在尝试从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));
}

任何暗示都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

为了让Durable订阅接收在脱机时发送的消息,必须先在Broker上注册。你通过创建一个像你在给定的代码中完成的实例来注册它,然后一旦它离线,通过调用close()等消息发送到它的主题将被存储,以便它可以在以后读取它们。如果您尚未注册此消费者,那么发送到主题的消息将被删除。

您还需要Connection的唯一客户端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));
}