Сценарий
Мы работаем над настройкой JMS «точка-точка».Здесь производитель намного быстрее, чем потребитель.На стороне потребителя у нас есть настройка Listener, которая запускает onMessage()
в ней всякий раз, когда запись доступна в брокере.
Мы порождаем потоки для каждого сообщения, полученного в onMessage()
.В настоящее время у меня есть пул потоков maxpoolsize=2
с размером blocking queue
2000
.В определенных сценариях нет.количество использованных сообщений перекрывает указанную выше конфигурацию, и сообщения начинают отклоняться из-за недостатка свободного места в очереди блокировки.
Для этого я планирую добавить в onMessage()
операцию блокировки, которая предотвратит потребление новых сообщений.например, фрагмент:
public void onMessage(Message message) {
while( ! spaceAvailableInPoolQueue());//Wait here
//Actual work
}
Насколько я понимаю, потребитель получает сообщения из буфера prefetch
.Для each
(или некоторых) сообщений в этом буфере запускается событие и создается поток, который вызывает onMessage () внутри слушателя.
Вопрос
Будет ли эта блокировкаоперация timeout
базовые потоки, которые отправляют данные от брокера?
Или будет ли локальный поток, ожидающий завершения onMessage () по истечении времени ожидания конечного потребителя?В целом, это правильный подход?