学习持久订阅。我调整了here给出的示例。我写了两个程序。在一个我创建主题和发送PERSISTENCE模式的消息。在其他程序中,我为同一主题创建持久订阅者并尝试接收。
我运行第一个程序。它成功完成。然后我运行第二个(消费者)计划。但它没有任何消息。 receive()消息仍然被阻止。
我错过了什么?
制作人计划的主要部分是
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
try{
con = connectionFactory.createConnection();
con.setClientID("DurabilityTest");
con.start();
session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic myFirstTopic = session.createTopic("myFirstTopic");
MessageProducer producer = session.createProducer(myFirstTopic);
// Registering consumers. But not calling receive on them
MessageConsumer consumer1 = session.createDurableSubscriber(myFirstDurableTopic, "consumer1", "", false);
MessageConsumer consumer2 = session.createDurableSubscriber(myFirstDurableTopic,"consumer2", "", false);
TextMessage txtMsg = session.createTextMessage("Namaskar mitranno2!!");
producer.send(myFirstTopic, txtMsg, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE+10000);
}catch(JMSException e){
e.printStackTrace();
}
消费者计划的主要部分是
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
try{
con = connectionFactory.createConnection();
con.setClientID("DurabilityTest");
con.start();
session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic myFirstTopic = session.createTopic("myFirstTopic");
MessageConsumer consumer1 = session.createDurableSubscriber(myFirstTopic, "consumer1", "", false);
processMessage(consumer1,consumer1.receive());
MessageConsumer consumer2 = session.createDurableSubscriber(myFirstTopic,"consumer2", "", false);
processMessage(consumer2,consumer2.receive());
}catch(JMSException e){
e.printStackTrace();
}
答案 0 :(得分:0)
持久主题订阅仅在创建后才开始保留邮件。因此,如果您向主题发送消息,并且在代理上没有注册持久主题订阅,则无论消息的持久性模式如何,都会丢弃这些消息。
如果您重做测试并首先创建一个持久的主题订阅,然后关闭使用者,您可以将持久性消息发送到主题,然后再次运行持久性消费者测试时,它将在离线时发送消息。
了解您的应用程序到底发生了什么事情很棘手但是VM代理的使用可以在这里发挥作用,鉴于这两个位生成器中的每一个都给出了代码,这是不确定的/ consumer没有创建自己的VM代理实例,它们是否在同一个VM中运行?
为什么不站起来经纪人并使用您的客户端程序连接到它?