2016-04-01 2 views
0

В моем случае предположим, что существует 50 очередей JMS, получающих сообщения разных типов.Как ограничить активных слушателей JMS для очередей много?

Если я реализовал 50 слушателей JMS (по одной для каждой очереди), он работает очень хорошо.

Однако, когда у всех 50 очередей было много ожидающих сообщений, все мои 50 слушателей JMS работали одновременно (т. Е. Работало бы 50 потоков JAVA). Это сделало мой сервер перегруженным (если он имеет очень ограниченный ресурс ОЗУ и легко выходит из памяти).

Так что я думаю, могу ли я ограничить количество активных слушателей. Скажем, ограничить до 10 активных слушателей одновременно. Иногда слушатель 01 ~ 10 работает в очереди 01 ~ 10, а иногда слушатель 11 ~ 20 может работать в очереди 11 ~ 20 и т. Д.

И даже есть новые сообщения, входящие в очередь 01 ~ 10, слушатель 01 ~ 10 должен быть чтобы уснуть некоторое время и позволить другим слушателям работать.

Как я могу достичь этого случая?

ответ

0

Обычно это один прослушиватель в очереди, поэтому, если вы не будете управлять активными/неактивными слушателями, вы получите поток, выполняемый каждый раз, когда сообщение доставляется в очередь.

Что вам нужно - это способ управления масштабированием, независимо от того, куда доставляются сообщения. На ум приходят две идеи:

1) Требуется ли для обработки сообщений некоторый ресурс с интенсивной памятью? Например, соединения с базой данных часто используются совместно/объединены, чтобы избежать создания слишком большого количества (хотя слишком многие подключения часто являются проблемой на стороне сервера, возможно, есть другой ресурс, который вам нужно предоставить).

2) Используя семафоры, ограничьте количество параллельных потоков, разрешенных путем предоставления каждому потоку разрешения семафора перед запуском, возвращая его в конце (очень важно!). Затем, если вы получаете много одновременных сообщений, только одно сообщение обрабатывается одновременно, а другая очередь - в обработчике слушателя для сообщения.

3) Вы можете объединять сообщения в новые очереди, в которых есть слушатели, которые выполняют обработку. Слушатели для очередей 1-10 публикуют сообщение newQueue1, очереди 11-20 отправляют сообщение newQueue2 и т. Д., А затем у вас есть слушатели, работающие над новымиQueue1, newQueue2 и т. Д.