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 ответ
Подписка на длительную тему начинает сохранять сообщения только после ее создания. Таким образом, если вы отправляете сообщения в раздел, и в брокере не зарегистрированы подписки на длительные темы, эти сообщения отбрасываются независимо от режима сохранения сообщения.
Если вы повторите тестирование и сначала создадите подписку на длительную тему, а затем закроете потребителя, вы можете отправить постоянные сообщения в тему, а затем, когда вы снова запустите тестирование долговременного потребителя, оно получит сообщение, отправленное в автономном режиме.
Сложно знать, что именно происходит в вашем приложении, но здесь может быть задействовано использование брокера виртуальных машин, нет уверенности, учитывая код, учитывая, что каждый из этих двух битов производитель / потребитель не создает свой собственный экземпляр Брокер виртуальных машин, они запускаются на одной виртуальной машине?
Почему бы вам не поднять брокера и не подключиться к нему с помощью клиентских программ?