我有一个JMS侦听器,在侦听器内我使用ExecutorService在固定数量的线程上运行一个worker。像这样:
public void onMessage(Message m) {
executor.execute(new Worker(m));
}
这个执行程序有10个线程,如果我同时收到100条消息,并且每个这些工作程序运行需要几秒钟,我是否会有90个JBoss JMS线程等待10个活动工作程序?那么这些传入消息中的每一个都会获得自己的线程并在等待时耗尽我的资源吗?
我完全错了,有更好的方法吗?
我正在使用JBoss EAP和HornetQ
答案 0 :(得分:2)
您不需要Executor,每个MDB都在自己的线程中运行。您可以控制可以向此MDB传递消息的最小和最大会话数。请参阅How to limit the number of MDB instances listening to a Jboss JMS queue。 因此,在您的方案中,您可以像这样定义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条消息,其余消息正在队列中等待。当处理一个消息(并从队列中删除)时,将处理下一条消息。