使用队列/MDB将实时消息优先于批处理消息



在我的应用程序中,特定的服务具有恒定的带宽(例如,一次100个事务),对服务的请求实时到达,以及批处理作业(队列)。实时请求的分布并不均匀。我需要一种方法来确保在批处理作业之前先处理实时作业,并确保在任何时候我都不会超过服务的阈值。

请评估以下方法。

有两个队列A-实时和B-批处理作业。具有大小为100(服务阈值)的线程池,并让线程池首先尝试从A中挑选消息,如果有其他从B中挑选的话。

我的应用程序运行在Weblogic上,我想使用MDB而不是线程池,但无法使MDB侦听多个队列。

在JMS中,您可以设置一个消息优先级,如果可能的话,该优先级应该得到尊重。这可能是一个简单的尝试。

另一个选项可以是在客户端的消息上设置JMS属性,并在MDB上使用消息选择器。您可以将MY_MESSAGE_TYPE设置为batch/rt,然后部署多个MDB,这些MDB正在侦听同一队列,但可以分配给不同的工作管理器。请记住,工作经理!=线程池。您还可以设置一个请求类,以确保如果批处理池正在使用,则RT池不会缺少线程/CPU。

通过这种设计,我相信,如果您有两个MDB,其中一个带有消息选择器,那么满足选择器条件的消息应该在没有选择器的MDB(BATCH)之前传递到带有该选择器的MDB。这将是一个相当简单的POC——设置一个向队列发送消息的客户端,其中一些客户端将JMS属性设置为RT,而另一些客户端则没有设置JMS属性。

10.0参考(仍然适用):http://docs.oracle.com/cd/E11035_01/wls100/config_wls/self_tuned.html

最新更新