【问题标题】:JMS Durable subscription. Subscriber do not receive messagesJMS 持久订阅。订阅者收不到消息
【发布时间】:2017-11-08 20:33:17
【问题描述】:

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

【问题讨论】:

    标签: java jms activemq durable-subscription


    【解决方案1】:

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

    如果您重做测试并首先创建持久主题订阅,然后关闭消费者,您可以向主题发送持久消息,然后当您再次运行持久消费者测试时,它会在离线时发送消息。

    很难知道您的应用程序中到底发生了什么,但这里可能会使用 VM 代理,鉴于这两个位生产者/消费者都没有创建自己的代码,因此无法确定代码VM 代理的实例,它们是否在同一个 VM 中运行?

    您为什么不建立代理并使用您的客户端程序连接到它?

    【讨论】:

    • 更新您的问题以显示代码,否则不会发生
    • 已更新,仍不清楚您在做什么,但您显然做错了什么。
    • 我运行的第一个程序创建了 2 个消费者和 1 个生产者。生产者发送消息。会话和连接已关闭。程序结束。然后我运行第二个程序,其中创建了两个具有相同 ID 的消费者并尝试接收消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2012-05-30
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多