0

学习持久订阅。我调整了这里给出的例子。我写了两个程序。在一个中,我创建主题并使用 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();
}
4

1 回答 1

1

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

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

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

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

于 2017-06-07T14:07:43.527 回答