Spring JMS обмен сообщениями с JmsListener - как он масштабируется?
Я пытаюсь использовать Spring JMS для обмена сообщениями с @JmsListener в масштабируемой форме, но я не вижу, чтобы это происходило. У меня есть компонент ConnectionFactory, который возвращает фабрику, которая подключается к Oracle Advanced Queue через JMS и пул источников данных базы данных.
Проблема начинается, когда каждый получатель @JmsListener снова подключается к JMS (и, следовательно, к пулу базы данных). Насколько я понимаю, у меня может быть много методов @JmsListener, по одному для каждой службы, но в этом смысле я очень ограничен.
Общее соединение включено, но поскольку каждый @JmsListener создает свой DefaultMessageListenerContainer, у каждого из них есть соединение с базой данных.
Если я также хочу, чтобы службы обрабатывали сообщения одновременно и устанавливали container.setConcurrency("3-5")
затем открывается 3 * numberOfListeners
соединения.
Если я использую container.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE)
затем каждую секунду каждый слушающий контейнер подключается и отключается от JMS/ базы данных.
Я хочу что-то, что подключается один раз (или более, если есть параллельные задания для обработки) к JMS/ базе данных, чтобы не подключать время подсчета слушателя и не подключать-отключать каждую секунду для каждого слушателя.
1 ответ
Вы можете использовать SingleConnectionFactory
обернуть фабрику поставщика и все контейнеры будут использовать одно и то же соединение.