我正在尝试从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));
}
任何暗示都会受到赞赏。
答案 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));
}