IBM MQ消息限制

时间:2011-07-16 05:40:40

标签: ibm-mq mq

我们正在使用IBM MQ,我们在控制其向其收件人的异步传递方面遇到了一些严重问题。我们正在配置一些java侦听器,现在问题是我们需要控制向侦听器发送的消息,因为消息来到服务器的数量已经达到数百万,并且服务器机器没有那么多容量来处理这么多线程,所以有没有像IBM MQ那样限制我们可以像Apache MQ那样配置预取限制的方法呢?

还是有其他方法可以达到这个目的吗?

目前,当侦听器达到某个X限制时,我们正在关闭与IBM MQ的连接,但似乎没有效率。

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

2 个答案:

答案 0 :(得分:4)

通常使用像MQ这样的消息队列技术,队列的一点是发送方与接收方分离。如果您遇到消息卷问题,那么答案是让他们在接收器队列中排队并尽可能地处理它们,而不是限制发送者。

显而易见的答案是限制允许侦听器占用的最大线程数。我假设你正在使用某种MQ线程池?你使用什么平台提供无限的监听线程?

从你的描述来看,几乎听起来你正在运行一些进程 - 一旦它检测到队列中的消息 - 它就会读取消息,启动一个新线程并返回并再次查看队列。这是错误的做法。

您应该从队列本身读取一定数量的进程线程(从一个开始并根据需要向上扩展,并在服务器的限制范围内)。如果你得到一个MQRC 2033(队列中没有消息),他们每个人都会以共享模式打开队列,并且要么等待,要么立即进入睡眠状态。

希望有所帮助。

答案 1 :(得分:0)

如果您在应用程序服务器环境中运行,那么activationSpec上的maxPoolDepth属性将定义MDB的最大ServerSessionPool大小 - 减少这将限制同时传递的数量消息。

当然,如果您的MDB(或JSE环境中的javax.jms.MessageListener)除了将消息传递给其他东西(或者更糟糕的是,只是产生一个非托管的线程并启动它)之外什么都不做,onMessage将快速旋转并且你仍然会遇到问题。所以在这种情况下你也需要限制其他资源,例如通过线程池配置。

关闭与QM的连接绝不是一种有效的方法,因为MQCONN / MQDISC周期很昂贵。