如何限制很多队列的活动JMS侦听器?

时间:2016-04-01 02:54:54

标签: java jms

就我而言,假设有50个JMS队列接收不同类型的消息。

如果我实现了50个JMS侦听器(每个队列一个),那么它的工作效果非常好。

但是,当所有50个队列中都有许多待处理消息时,我所有的50个JMS侦听器都在同时工作(即有50个JAVA线程正在工作)。这使我的服务器超载(如果它的RAM资源非常有限并且很容易出现内存)。

所以我在想是否可以限制活动监听器的数量。我们说,一次只能限制最多10个活跃的听众。有时监听器01~10在队列01~10上工作,有时监听器11~20可以在队列11~20上工作等。

即使有新消息进入队列01~10,监听器01~10也应该能够休眠一段时间并让其他听众工作。

我怎样才能实现这种情况?

1 个答案:

答案 0 :(得分:0)

通常它是每个队列的一个侦听器,因此除非您要管理侦听器处于活动/非活动状态,否则每次将消息传递到队列时都会得到一个正在运行的线程。

您需要的是一种管理扩展的方法,无论消息的传递位置如何。想到两个想法:

1)消息处理是否需要一些可以某种方式共享的内存密集型资源?例如,数据库连接通常是共享/池化的,以避免创建太多(尽管太多的连接通常是服务器端问题,可能还有另一个需要共享的资源)。

2)使用信号量,限制每个线程在开始之前从信号量获得许可所允许的并发线程数,最后返回它(非常重要!)。然后,如果您收到大量并发消息,则只会同时处理n条消息,而另一条消息会在消息的侦听器处理程序中排队。

3)您可以将消息聚合到具有执行处理的侦听器的新队列中。队列1-10的监听器将消息发布到newQueue1,队列11-20将消息发布到newQueue2等,然后让你有听众处理newQueue1,newQueue2等。