当前位置: 首页 > 知识库问答 >
问题:

Websphere 7 Websphere MQ 7.X Spring Integration JMS - Message Listener 停止从队列读取消息

鄂育
2023-03-14

我们正在使用 JMS 和 Spring Integration 读取来自 Websphere MQ 的消息。

<task:executor id="demoMessageReceiverChannelTE" pool-size="1-3" queue-capacity="5" keep-alive="1" rejection-policy="CALLER_RUNS"/>

<int:channel id="demoMessageReceiverChannel">
    <int:dispatcher task-executor="demoMessageReceiverChannelTE"/>
    <int:interceptors>
        <int:ref bean="messageReceiverInterceptor" />
    </int:interceptors>
</int:channel>

<jms:message-driven-channel-adapter
id="demoMesssageReceiverAdapter" channel="demoMessageReceiverChannel"
connection-factory="srcJmsConnectionFactory" destination="srcReceiverQueue"
error-channel="errorChannel" message-converter="demoIncomingMessageConverter"
transaction-manager="srcJmsTransactionManager" send-timeout="65000"
header-mapper="demoJmsHeaders" />

还有另一个系统,它将消息放在此队列上。(超出我们的范围)

我们可以一次有 2000 条消息在队列中被读取。

有时,消息侦听器会停止从队列读取消息,当我尝试解决此问题时,它给出了队列中有一些未提交消息的原因,侦听器尝试读取该消息,将无法进一步处理并挂起本身。

与从队列中手动删除该消息一样,它会完美地处理其他消息。

那么如何跳过这些未提交的消息,以便系统可以继续下一条消息呢?

共有1个答案

史洛城
2023-03-14

听起来像是一个经典的未经处理的毒物信息问题。当应用读取它无法处理的消息时,该消息将回退到队列。然后再次读回它,因为它位于队列的顶部。这会导致消息显示为处于同步点状态,直到最后侦听器放弃并停止。

有时问题出在应用中,是应用显式调用 ROLLBACK。有时,尽管发生回滚,但应用程序甚至会看到该消息。例如,如果消息无法转换为本地代码页,或其他低级错误。

如果发生这种情况,答案是定义一个撤销队列,然后更改输入队列以指向它。例如,如果输入队列称为 SRC。接收器。队列 您可以使用 runmqsc 在 QMgr 上执行以下操作:

DEFINE QL(SRC.RECEIVER.QUEUE.BKOUT)
ALTER QL(SRC.RECEIVER.QUEUE) BOQNAME(SRC.RECEIVER.QUEUE.BKOUT) BOTHRESH(15)

如果问题确实是有害消息,则问题消息将在回退队列中显示为未提交的消息。一旦应用针对源队列发出下一个 COMMIT,撤销消息将在撤销队列中可见。如果没有其他消息到达源队列,则病毒消息将在回退队列中保持未提交状态,或者在应用或 QMgr 调用 ROLLBACK 时可能还原到源队列。

回退队列的设置很简单,应该是标准做法,所以我建议不管它是否能解决问题。请参阅信息中心中的处理 WebSphere MQ 类中的 JMS 有害消息。

 类似资料:
  • 有一个SQS队列,我在其中不断收到消息。我只需要阅读和处理过去24小时内收到的信息。目前收到的信息应在第二天处理<代码>时间戳存储在消息正文中。 是否可以从SQS队列中选择性地读取消息。例如,只读那些值大于前一天的时间戳但小于当前时间戳(当前时间戳是此作业运行的时间)的消息?

  • 我有一个java客户机,它在队列中发送jms消息(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端id号。消息正在处理中,然后进入另一个队列(“队列响应”)。如何让客户机等到具有其id的消息在队列中,然后读取它。我曾尝试使用侦听器并实现onMessage,但当收到消息时,我如何停止侦听?

  • 我有一个应用程序,在这个应用程序中,我可以在进程的一部分中以JSON格式将消息写入Azure服务总线队列。我有一个下游进程,我想将该消息从队列中弹出,将json转换为一个对象,然后处理该对象。 我没有问题将消息推送到队列上,但我还没有找到任何将消息从队列中逐一或循环弹出的示例。我在微软或Github上看到的每一个例子都是一个控制台应用程序(在网络应用程序中毫无用处),它设置了某种侦听器,可以抓取队

  • 我正在使用NET Core 5.0.0开发一个API Web ASP.NET Core项目,并使用Azure.Storage.Queues12.6.0来写入和读取队列消息。 一切正常,但我想知道我阅读消息的方式是否可以,或者在速度和效率方面有更好的方法。 这是我用的密码。它只是Microsoft教程中的一段代码,放在a while()循环中。AzureQueue只是QueueClient类的一个实

  • 我正在使用mo01 java支持包从系统读取事件消息。管理频道事件队列。 下面是代码的链接: mo01java 我可以从通道事件队列消耗的PCF消息中读取所有参数名称/值,但以下参数除外, 下面是代码的一部分,

  • 我想从azure服务总线(队列)读取所有消息。 我已经按照下面的指示链接https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-php-how-to-use-queues 目前它只能获取一条消息。。 我想从服务总线(队列)获取所有消息。 提前谢谢。。

  • 我正在运行kafka2.11-0.9.0.0和一个基于Java的生产者/消费者。与消息~70 KB一切工作良好。但是,在生产者将一个更大的70 MB消息排入队列之后,kafka似乎停止将消息传递给消费者。即。不仅大的消息没有传递,后续的小消息也没有传递。我知道制作人成功了,因为我使用了kafka回调进行确认,我可以在kafka消息日志中看到消息。 kafka配置自定义更改: 使用者配置:

  • 我在Weblogic 12c上部署了一个MDB,它从JMS队列(UDQ)读取消息。MDB正在读取消息,但它没有从JMS队列中删除,这导致消息被重复读取。所以,我想知道MDB何时确认JMS队列它成功读取了消息,并且队列应该删除该消息。