У меня есть JMS Listener, внутри слушателя я использую ExecutorService для запуска рабочего на фиксированное количество потоков. вот так:
public void onMessage(Message m) {
executor.execute(new Worker(m));
}
Этот исполнитель имеет 10 потоков, если я получаю 100 сообщений одновременно, и для каждого из этих рабочих требуется несколько секунд, у меня будет 90 потоков JBoss JMS, ожидающих 10 активных рабочих? Так что каждый из этих входящих сообщений получает свой собственный поток и питается моими ресурсами во время ожидания?
Я делаю это совершенно неправильно, есть ли лучший способ?
Я использую JBoss EAP и HornetQ
Вам не нужен 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 сообщений, а остальные сообщения ждут в очереди. Когда одно сообщение обрабатывается (и удаляется из очереди), обрабатывается следующее сообщение.