我有一个使用 ActiveMQ 5.13.4 的 JMS 设置,其中包含多个死信队列 (DLQ),并且我想将特定消息从 DLQ 移回到原始队列中,以便我的应用程序可以在原始错误条件消失后再次处理它们解决了。
我一直在使用名为 A 的 JMS 实用程序,它可以使用
--move-queue
选项将多条消息从一个队列移动到另一个队列。这非常有效,因为您可以使用 --count
选项将所有消息移动到某个数字,例如这会将 10 条消息从 DLQ1 移动到 DLQ2
a.bat -b tcp://192.168.1.100:61616 --count 10 --move-queue DLQ1 DLQ2 -j -U admin -P admin
10 msgs moved from DLQ1 to DLQ2
Operation completed in 172ms (excluding connect)
我想要做的是使用特定消息的 JMS 消息 ID 将其从一个队列移动到另一个队列。
--get
命令确实找到了所需的消息,但它消耗了它,因此它从该点消失了,例如在队列 A1 上获取一条消息。
a.bat --broker tcp://192.168.1.100:61616 --user admin --pass admin --get A1 "JMSMessageID=ID:app02-49195-1696991438815-4:104:1:1:1" -j
-----------------
Message Headers
JMSCorrelationID: null
JMSExpiration: 1970 01 01 01:00:00
JMSDeliveryMode: persistent
JMSMessageID: ID:app02-49195-1696991438815-4:104:1:1:1
JMSPriority: 5
JMSTimestamp: 2023 11 08 07:24:20
JMSType: null
JMSDestination: queue://A1
JMSRedelivered: false
JMSReplyTo: Not set
Message Properties
Payload:
message
Operation completed in 15ms (excluding connect)
有一个
--selector
选项确实可以找到所需的消息,但我似乎无法让它与 --move-queue option
一起使用 - 它表示操作已完成,但它使用 jms 标头 ID 作为目标队列名称? ?例如
a.bat --broker tcp://192.168.1.100:61616 --user admin --pass admin --move-queue A1 --selector A1 "JMSMessageID=ID:app02-49195-1696991438815-4:106:1:1:1" --move-queue A2 -j
0 msgs moved from A1 to JMSMessageID=ID:app02-49195-1696991438815-4:106:1:1:1
Operation completed in 125ms (excluding connect)
我认为发生的情况是
--selector
选项无法根据 JMSMessageID
进行过滤,因此 --move-queue
选项并没有执行任何操作。 --selector
选项实际上适用于 JMS 标头信息吗?
我想我现在实际上已经解决了这个问题。有 2 个问题。
--选择器“JMSMessageID='ID:app02-49195-1696991438815-4:128:1:1:12'”
如果您不这样做,它将找不到正确的消息。
--移动队列 A1 --选择器 "JMSMessageID='ID:49195-1696991438815-4:128:1:1:12'" A2 --jms-标题
因此,使用 JMSMessageID 将单个消息从名为 A1 的队列移动到另一个名为 A2 的队列的最终命令如下。
a.bat --broker tcp://192.168.1.100:61616 -U admin -P admin --move-queue A1 --selector "JMSMessageID='ID:49195-1696991438815-4:128:1:1:12'" A2 --jms-headers 1 条消息从 A1 移至 A2 操作在 141ms 内完成(不包括连接)