Истечение срока действия потребителей Spring JMS на сервере TIBCO EMS истекает самостоятельно

Мы создали службу обмена сообщениями 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


person Prabal Rakshit    schedule 16.05.2017    source источник


Ответы (1)


Скорее всего, что-то в сети (маршрутизатор, межсетевой экран и т. Д.) Незаметно разрывает неактивные соединения.

Хотя это и не входит в спецификацию JMS, большинство поставщиков реализуют какой-то механизм тактового сигнала, чтобы время от времени клиент / сервер обменивались эхо-запросами, чтобы предотвратить такие действия сетевых компонентов и / или обнаруживать такие условия.

Посмотрите документацию Tibco, чтобы выяснить, как настроить тактовые импульсы (они могут назвать это как-то иначе).

person Gary Russell    schedule 16.05.2017