如何实现JMS监听器来忽略基于List/Map的特定消息?

问题描述 投票:0回答:1

我有代表两个用户之间的操作的消息发送到队列。 用户作为属性存储在消息中。 要求是当同时处理涉及一个或另一个用户的不同操作时,不允许处理[从队列中获取]的操作。

由于我使用的是 Grails(即 Spring)和 ActiveMQ,所以我考虑以这种方式实现它:

创建一个带有事务的MessageListenerContainer,当监听器读取消息时,它将获取事务的状态,检查userA或userB当前是否有处理的操作,并根据结果-处理操作或回滚jms事务。 我考虑过创建一个简单的地图来存储有关当前处理的用户的详细信息:

{
  userId : [listenerId, timestamp]
}

我想存储侦听器 ID 和时间戳,以便有一种方法可以简化错误处理[尚未实现]。

因此,在处理操作之前,userId 将被放在那里,并且在操作完成之后,密钥将被删除。

不幸的是,我在原型设计时遇到了一个大问题。当我回滚消息时,侦听器将等待并再次读取相同的消息。 这意味着,如果我为 userA 获取 5 个操作,并且只有 5 个侦听器,那么在处理第一个操作时,整个过程将被卡住。那不是我想要的。 我希望侦听器读取一条消息,检查是否可以处理操作,如果不能处理下一条消息。 是否可以实施?

在我的只有一个侦听器的原型中,当我发送 5 条消息并将其回滚时,我得到的结果如下 [这是来自读者:读取消息时的时间戳 + 消息编号]:

1288892171570 0
1288892171578 0
1288892176582 0
1288892181586 0
1288892186589 0
1288892191594 0
1288892196596 0
1288892201601 1
1288892206604 1
1288892211607 1
1288892216612 1
1288892221614 1
1288892226618 1
1288892231621 1
1288892236625 2
1288892241629 2
1288892246632 2
1288892251636 2
1288892256641 2
1288892261645 2
1288892266647 2
1288892271652 3
1288892276656 3
1288892281659 3
1288892286663 3
1288892291667 3
1288892296671 3
1288892301674 3
1288892306679 4
1288892311682 4
1288892316686 4
1288892321689 4
1288892326693 4
1288892331696 4
1288892336700 4

重新投递策略是 AMQ 5.4.1 的默认策略。 我希望看到的是: 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4...

我认为它应该以某种方式工作,当事务回滚并且消息被标记为重新传递时,它将被延迟,但侦听器将继续工作。此外,当消息重新传递时,它将返回到队列中的位置 - 队列[应该是?] 按消息时间戳排序。

示例[假设同时发送了所有 5 条消息]: Msg 0 被读取,进行检查,可以处理->处理 读取消息 1,执行检查,无法处理,事务回滚,延迟 X 时间 读取消息 2,执行检查,无法处理,事务回滚,延迟 X 时间 读取消息 3,执行检查,无法处理,事务回滚,延迟 X 时间 由于 X 时间已过,消息 1 重新传送,已执行检查,无法处理,事务回滚,延迟 X 时间 消息 4 已读...

我不确定我尝试做的事情是否可取,还是应该考虑以其他方式来做?我认为这样会很简单并且易于扩展。 也许这只是 AMQ 配置的问题,但我确实查看过,但在重新交付设置中没有找到任何有帮助的内容。

谢谢, 克里斯蒂安

spring jms
1个回答
0
投票

这似乎是 Active MQ 的一个“功能”:https://issues.apache.org/activemq/browse/AMQ-1853 在撰写本文时,问题正在等待审核,但包含一个可以使用 Camel 实现的解决方案的链接。 我认为这就是我要走的路(至少目前如此)。 我将创建两个队列: 动作队列 繁忙队列

Listener将从actionsQueue中获取动作并测试是否可以处理动作。 如果没有,它将把消息发送到busyQueue。 我将在 busyQueue 上进行骆驼监听,并以配置的延迟自动将消息路由到 actionsQueue。

如果我想使用最初的想法来实现它,这似乎是前进的方向。

我仍然想知道是否有更好的方法来做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.