JMS Прочная подписка. Абонент не получает сообщения

Изучение длительной подписки. Я подправил пример, приведенный здесь. Я написал две программы. В одном я создаю тему и отправляю сообщение в режиме 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 ответ

Подписка на длительную тему начинает сохранять сообщения только после ее создания. Таким образом, если вы отправляете сообщения в раздел, и в брокере не зарегистрированы подписки на длительные темы, эти сообщения отбрасываются независимо от режима сохранения сообщения.

Если вы повторите тестирование и сначала создадите подписку на длительную тему, а затем закроете потребителя, вы можете отправить постоянные сообщения в тему, а затем, когда вы снова запустите тестирование долговременного потребителя, оно получит сообщение, отправленное в автономном режиме.

Сложно знать, что именно происходит в вашем приложении, но здесь может быть задействовано использование брокера виртуальных машин, нет уверенности, учитывая код, учитывая, что каждый из этих двух битов производитель / потребитель не создает свой собственный экземпляр Брокер виртуальных машин, они запускаются на одной виртуальной машине?

Почему бы вам не поднять брокера и не подключиться к нему с помощью клиентских программ?

Другие вопросы по тегам