Ibm mq IBM MQ消息限制

Ibm mq IBM MQ消息限制,ibm-mq,mq,Ibm Mq,Mq,我们正在使用IBM MQ,在控制其向收件人的异步传递方面,我们面临一些严重的问题。我们正在配置一些java侦听器,现在的问题是我们需要控制传入侦听器的消息,因为到达服务器的消息以百万计,并且服务器机器没有那么大的容量一次处理这么多线程,所以有没有类似于在IBM MQ端进行节流的方法,我们可以像Apache MQ那样配置preetch限制 或者有没有其他方法来实现这一点 目前,当侦听器上达到某个X限制时,我们正在关闭与IBM MQ的连接,但这似乎不是一种有效的方法 请大家帮助我们解决这个问题。一般

我们正在使用IBM MQ,在控制其向收件人的异步传递方面,我们面临一些严重的问题。我们正在配置一些java侦听器,现在的问题是我们需要控制传入侦听器的消息,因为到达服务器的消息以百万计,并且服务器机器没有那么大的容量一次处理这么多线程,所以有没有类似于在IBM MQ端进行节流的方法,我们可以像Apache MQ那样配置preetch限制

或者有没有其他方法来实现这一点

目前,当侦听器上达到某个X限制时,我们正在关闭与IBM MQ的连接,但这似乎不是一种有效的方法


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

一般来说,对于MQ等消息队列技术,队列的要点是发送方与接收方是分离的。如果消息量有问题,那么答案是让它们在接收方队列上排队,并尽可能地处理它们,而不是限制发送方

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

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

您应该有一定数量的进程线程在运行(从一个开始,并根据需要扩展,并且在服务器的限制范围内),这些线程本身从队列中读取数据。它们都将在共享模式下打开队列,如果您获得MQRC 2033(队列中没有消息),则要么使用等待获取,要么使用睡眠执行即时获取


希望这能有所帮助。

一般来说,对于MQ等消息队列技术,队列的要点是发送方与接收方是分离的。如果消息量有问题,那么答案是让它们在接收方队列上排队,并尽可能地处理它们,而不是限制发送方

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

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

您应该有一定数量的进程线程在运行(从一个开始,并根据需要扩展,并且在服务器的限制范围内),这些线程本身从队列中读取数据。它们都将在共享模式下打开队列,如果您获得MQRC 2033(队列中没有消息),则要么使用等待获取,要么使用睡眠执行即时获取


希望这会有所帮助。

如果您在应用程序服务器环境中运行,则activationSpec上的maxPoolDepth属性将定义MDB的最大ServerSessionPool大小-减小此值将限制并发传递的消息数

当然,如果您的MDB(或JSE环境中的javax.jms.MessageListener)只将消息传递给其他对象(或者更糟糕的是,只需生成一个非托管线程并启动它),onMessage将快速旋转,您仍然会遇到问题。因此,在这种情况下,您还需要限制其他资源,例如通过线程池配置


关闭与QM的连接从来都不是一种有效的方法,因为MQCONN/MQDISC周期非常昂贵

如果您在应用程序服务器环境中运行,则activationSpec上的maxPoolDepth属性将定义MDB的最大ServerSessionPool大小-减小此值将限制并发传递的消息数

当然,如果您的MDB(或JSE环境中的javax.jms.MessageListener)只将消息传递给其他对象(或者更糟糕的是,只需生成一个非托管线程并启动它),onMessage将快速旋转,您仍然会遇到问题。因此,在这种情况下,您还需要限制其他资源,例如通过线程池配置

关闭与QM的连接从来都不是一种有效的方法,因为MQCONN/MQDISC周期非常昂贵