Есть следующий код (для получателя сообщений):
ConnectionFactory factory = new ConnectionFactory();
try (JMSContext context = factory.createContext("admin", "admin", JMSContext.AUTO_ACKNOWLEDGE))
{
factory.setProperty(ConnectionConfiguration.imqAddressList, "mq://127.0.0.1:7676,mq://127.0.0.1:7676");
int id = new Random().nextInt();
context.setClientID("" + id);
Topic topic = context.createTopic("Topic");
String selector= "name='value'";
String dur_id = "DurableC" + id;
JMSConsumer consumer = context.createDurableConsumer(topic,dur_id);
while (true) {
Message msg = consumer.receive();
System.out.println(msg.getBody(String.class));
}
} catch (Exception e) {
e.printStackTrace();
}
Есть следующий код для отправителя:
ConnectionFactory factory = new ConnectionFactory();
try (JMSContext context = factory.createContext("admin", "admin"))
{
factory.setProperty(ConnectionConfiguration.imqAddressList, "mq://127.0.0.1:7676,mq://127.0.0.1:7676");
Topic topic = context.createTopic("Topic");
TextMessage textMessage = context.createTextMessage("Message #" + msg);
textMessage.setStringProperty("name", "value");
context.createProducer().send(topic, textMessage);
Thread.sleep(1000);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
Проблема заключается в том, что если будет разрыв соединения, то никакие сообщения из Topic на консоль у меня не выводятся, хотя я создаю Durable Consumer. Объясните, что я делаю не так
В JavaDoc к методу createDurableConsumer пишется:
The JMS provider retains a record of this durable subscription and ensures that all messages from the topic's publishers are retained until they are delivered to, and acknowledged by, a consumer on this durable subscription or until they have expired.
A durable subscription will continue to accumulate messages until it is deleted using the unsubscribe method.
Т.е., под Durability подразумевается сохранение сообщений вне зависимости от того, подключен получатель к очереди или нет. Про восстановление разорванных соединений ничего не сказано.
Вы можете назначить слушателя ошибок:
context.setExceptionListener(new MyExceptionListener());
и реализовать в нём логику проверки наличия соединения и его восстановления в случае обрыва.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости