JMS onMessage JBoss, сколько потоков используется?

1

У меня есть JMS Listener, внутри слушателя я использую ExecutorService для запуска рабочего на фиксированное количество потоков. вот так:

public void onMessage(Message m) {
    executor.execute(new Worker(m));
}

Этот исполнитель имеет 10 потоков, если я получаю 100 сообщений одновременно, и для каждого из этих рабочих требуется несколько секунд, у меня будет 90 потоков JBoss JMS, ожидающих 10 активных рабочих? Так что каждый из этих входящих сообщений получает свой собственный поток и питается моими ресурсами во время ожидания?

Я делаю это совершенно неправильно, есть ли лучший способ?

Я использую JBoss EAP и HornetQ

Теги:
jms
jboss

1 ответ

2
Лучший ответ

Вам не нужен Executor, каждый MDB запускается в своем потоке. И вы можете контролировать минимальное и максимальное количество сеансов, которые могут доставлять сообщения в этот MDB. См. Раздел Как ограничить количество экземпляров MDB при прослушивании очереди Jboss JMS. Таким образом, в вашем сценарии вы можете определить MDB следующим образом:

@MessageDriven(activationConfig = {   
@ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),   
@ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/myQueue"),
@ActivationConfigProperty( propertyName = "maxSession", propertyValue = "20")  
})
public class MyBean implements MessageListener {
  public void onMessage(Message m) {
    // do something with message
  }
}

Если в очереди ожидает 100 сообщений, обрабатываются первые 20 сообщений, а остальные сообщения ждут в очереди. Когда одно сообщение обрабатывается (и удаляется из очереди), обрабатывается следующее сообщение.

  • 0
    отлично, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню