Мы создали службу обмена сообщениями Spring Boot, которая прослушивает очередь JMS, размещенную на сервере TIBCO EMS (Enterprise Messaging Service). Это довольно простое приложение, которое получает сообщение JMS, выполняет некоторые манипуляции с данными и обновляет базу данных.
Проблема в том, что иногда в очереди нет потребителей JMS, и входящие сообщения не обрабатываются. Однако приложение Spring Boot запущено и работает (проверено с помощью ps -ef). Перезапуск приложения восстанавливает пользователя, но, к сожалению, это неосуществимое решение в производственной среде и т. Д.
Другие интересные факты:
- Мы наблюдали, как это происходит, когда JMS-сервер принимает SSL-трафик и развертывается как отказоустойчивая пара (хотя это пока неоспоримое наблюдение).
- В журнале нет абсолютно никакой индикации (например, ошибки), когда потребитель выходит из строя.
- Мы используем Spring-JMS (4.1.0) и TIBCO EMS (8.3.0)
Фрагмент кода создания экземпляра DefaultJmsListenerContainerFactory:
@Bean
public DefaultJmsListenerContainerFactory listenerJmsContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
TibjmsQueueConnectionFactory cf = new TibjmsQueueConnectionFactory("tcp://localhost:7222");
cf.setUserName("admin");
cf.setUserPassword("");
factory.setConnectionFactory(cf);
return factory;
}
Слушатель JMS:
@JmsListener(destination = "queue.sample", containerFactory = "listenerJmsContainerFactory")
public void listen(TextMessage message, Session session) throws JMSException{
System.out.println("Received Message: "+message.getJMSMessageID());
System.out.println("Acknowledgement Mode: "+session.getAcknowledgeMode());
// Some more application specific stuff
}
Пока мы пытаемся настроить дополнительное ведение журнала как на стороне Spring Boot, так и на стороне TIBCO, мы хотели бы проверить некоторые моменты, например:
- Может ли быть ситуация, когда потребитель, бездействующий более определенного времени, автоматически истекает?
- Это то, что регулируется настройками DMLC, такими как idleConsumerLimit, idleTaskExecutionLimit и т. Д.?
- Можно ли просмотреть эти свойства в упомянутом выше загрузочном коде Spring? Например, в приведенном выше коде прослушиватель JMS создается под капотом DefaultJmsListenerContainerFactory. Итак, как мы можем получить доступ к объекту DMLC, чтобы мы могли вызывать такие методы, как getIdleConsumerLimit (), getIdleTaskExecutionLimit () и т. Д.
Спасибо за вклад, Prabal