如何限制许多队列的活动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) 消息处理是否需要一些内存密集型资源,这些资源可以以某种方式共享?例如,数据库连接通常是共享/池化的,以避免创建太多连接(尽管太多连接通常是服务器端的问题,但可能还有其他资源需要共享)。

2) 使用信号量,通过让每个线程在启动前从信号量中获得许可,并在结束时返回许可,来限制允许的并发线程数(非常重要!)。然后,如果收到大量并发消息,则只有n条消息被并发处理,而另一条则在消息的侦听器处理程序中排队。

3) 您可以将消息聚合到具有侦听器的新队列中进行处理。队列1-10的侦听器将消息发布到newQueue1,队列11-20将消息发布给newQueue2,等等,然后您就有侦听器在处理newQueue1、newQueue2等。

最新更新