2011-07-16 192 views
-1

我们正在使用IBM MQ,我们正面临着关于它的控制异步传送到其recipient.We一些严重的问题是具有配置一些Java的听众,现在的问题是,我们需要控制消息向听众来临,因为到达服务器的消息数量是数百万,而服务器机器没有足够的容量一次处理那么多的线程,那么在IBM MQ端有没有像我们可以像Apache MQ那样配置预取限制的任何方法?IBM MQ消息节流

或者还有其他方法可以实现吗?

目前,我们正在缩小与IBM MQ连接时,一些X极限监听达到,但doesen't似乎是有效的方法。

请大家帮我们解决这个问题。

回答

4
与消息排队技术,如MQ队列的点

通常是发送者被从接收器去耦。如果您在使用邮件时遇到问题,那么答案就是让他们排队等待接收者队列并尽可能处理它们,而不是扼杀发件人。

答案显然是限制你的听众被允许占用的最大线程数。我假设你正在使用某种MQ线程池?你使用哪个平台提供无限的监听线程?

从你的描述,这听起来像你有运行的一些程序 - 只要它在队列中检测消息 - 它读取消息,启动一个新的线程,并返回并在队列再次样子。这是错误的方法。

你应该有运行的限定数量的进程的线程(先从一个,并根据需要扩展,你的服务器的范围之内),它从队列中读取自己。他们每个人都会以共享模式打开队列,或者等待或等待,或者如果您获得了MQRC 2033(队列中没有消息),立即进入休眠状态。

希望有所帮助。

0

如果您正在应用程序服务器环境中运行,那么activationSpec上的maxPoolDepth属性将为MDB定义最大的ServerSessionPool大小 - 这会减少并发传递的邮件数量。当然,如果您的MDB(或JSE环境中的javax.jms.MessageListener)除了将消息传递给其他东西(或者更糟,只产生一个非托管线程并启动它),onMessage将快速旋转并且你仍然可以遇到问题。因此,在这种情况下,您还需要限制其他资源,例如通过线程池配置。

合到QM的连接是从未的有效方式,因为MQCONN/MQDISC周期是昂贵的。