JMS持久订阅。订阅者不接收消息

时间:2017-06-07 13:04:12

标签: java jms activemq durable-subscription

学习持久订阅。我调整了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();
}

1 个答案:

答案 0 :(得分:0)

持久主题订阅仅在创建后才开始保留邮件。因此,如果您向主题发送消息,并且在代理上没有注册持久主题订阅,则无论消息的持久性模式如何,都会丢弃这些消息。

如果您重做测试并首先创建一个持久的主题订阅,然后关闭使用者,您可以将持久性消息发送到主题,然后再次运行持久性消费者测试时,它将在离线时发送消息。

了解您的应用程序到底发生了什么事情很棘手但是VM代理的使用可以在这里发挥作用,鉴于这两个位生成器中的每一个都给出了代码,这是不确定的/ consumer没有创建自己的VM代理实例,它们是否在同一个VM中运行?

为什么不站起来经纪人并使用您的客户端程序连接到它?