Java MQ队列MQTT_第一个触发器创建多个触发器消息

Java MQ队列MQTT_第一个触发器创建多个触发器消息,java,spring,jms,ibm-mq,mq,Java,Spring,Jms,Ibm Mq,Mq,我们有一个标记为已触发的应用程序MQ队列,并在其上设置了一个MQTT\ U 当消息第一次到达该队列时,队列管理器将创建一个触发器消息,并将其写入为此目的定义的启动队列中。 触发器消息触发监视进程的执行,该进程将启动触发器监视器应用程序,该应用程序将逐个从应用程序队列读取消息 我们使用springjmstemplate从应用程序队列中逐个读取消息。jmsTemplate实例打开到应用程序队列的连接,从那里读取消息,然后关闭连接 我们遇到的问题是,当连接关闭时,如果应用程序队列中有多条消息,将向启动

我们有一个标记为已触发的应用程序MQ队列,并在其上设置了一个MQTT\ U

当消息第一次到达该队列时,队列管理器将创建一个触发器消息,并将其写入为此目的定义的启动队列中。 触发器消息触发监视进程的执行,该进程将启动触发器监视器应用程序,该应用程序将逐个从应用程序队列读取消息

我们使用springjmstemplate从应用程序队列中逐个读取消息。jmsTemplate实例打开到应用程序队列的连接,从那里读取消息,然后关闭连接

我们遇到的问题是,当连接关闭时,如果应用程序队列中有多条消息,将向启动队列发送一条新的触发器消息,这将导致另一个触发器监视器应用程序(在不同主机上运行)弹出。这不是我们想要的,因为对于我们来说,只有一个消息使用者同时处于活动状态是非常重要的,因为消息序列非常重要

我们有多个触发器监视器应用程序(或使用者)是出于HA原因

因此,我的问题是:有没有一种方法可以防止MQ manager将多个MQTT_FIRST trigger消息发送到启动队列,并使其在消息到达空队列时只发送一次,就是这样。如果我们真的想再次发送一个消息触发器,我们可以使用触发器间隔来实现这一点,但是对于我们试图实现的目标,无论发生什么情况,初始化队列中都不应该有多个触发器消息

提前感谢 朱利安

我们的问题是,当连接关闭时,如果 应用程序队列中的多条消息将显示一条新的触发器消息 发送到启动队列,这将导致另一个 触发监视器应用程序(在不同主机上运行)以弹出

有没有办法防止MQ管理器先发送多个MQTT\U 将消息触发到启动队列,并使其仅发送一次 当消息到达一个空队列时,就是这样


是的,不要关闭连接。首先使用触发器时,需要阅读规则。规则之一是在关闭连接之前使用所有消息。如果你不遵守规则,你就不能抱怨。

我不是在抱怨。我正在现有规则的背景下寻找解决方案。当您在一个大批量中收到数千条消息时,由于各种原因,一次性处理它们是不切实际的:超时、事务量过大等等,您可能需要重新考虑设计。在这种情况下,触发器优先看起来不是正确的解决方案。如果需要考虑事务大小,可以尝试按深度触发。最简单的解决方案是大大减少批处理窗口。i、 e.不要每6小时运行一次,而是每小时或每20分钟运行一次。如果你是对的。MQTTèU首先没有为我们做这项工作。遗憾的是,IBM人员没有向我们提供一个标志,告诉队列管理器我只希望在收到第一条消息时触发该触发器,而不是在其他时间。只要我一直在监听启动队列,IBM就不应该关心我如何从应用程序队列中读取消息。换句话说,“您告诉我我收到了一条消息,让我按照自己的意愿处理它们,并且只在我离开启动队列而不是应用程序队列时再告诉我我收到了消息”。除了实际的规则之外,很高兴有了这些规则。@罗杰,你假设我们等待一批生成,然后开始使用它。这是错误的,因为我们希望尽快处理消息。我指出,我们正在寻求医管局的解决方案。为什么我们需要这个触发器,是因为我们希望我们的“竞争”MDB一次只运行一次,因此我们让它们侦听启动队列而不是应用程序队列,所以消息到达后,只有一个MDB来处理它。如果MDB发生故障,则会有其他人在保持消息序列的同时接管负载。