【问题标题】:JMS rewrite messageJMS 重写消息
【发布时间】:2016-07-26 21:50:48
【问题描述】:
我知道 JMS 消息是不可变的。但是我有一个任务要解决,这需要通过实体 ID 重写队列中的消息。可能是系统设计有问题,请帮帮我。
应用 A 向 JMS 发送消息(实体 id = 1)。应用 B 每分钟检查一次新消息。
应用 A 可能在一分钟内发送许多实体 id = 1 的消息,但应用 B 应该只看到最后一条。
有可能吗?
- 应用 A 应该尽可能快地工作,所以我不喜欢在新消息推送之前执行 removeMatchingMessages(String selector) 的想法。
【问题讨论】:
标签:
jms
rabbitmq
activemq
message-queue
【解决方案1】:
IMO 的方法存在缺陷。
即使您确实接受通过使用消息选择器在写入新消息之前删除实体 id = 1 的所有消息来清除队列,时间也会成为问题:无论哪个进程写入过时的消息都可能需要在写入新消息之前完成,某种程度的同步。
我能想到的另一个解决方案是在处理所有消息之前读取它们。每分钟,线程都会接收消息并将它们分桶。较早的实体 id = 1 消息将被较晚的消息替换,因此最后您有一组唯一的消息要处理。然后你处理它们。当然,现在您可能一次在内存中存储了太多消息,并且事务性被抛到了窗外,但它可能会达到您想要的效果。
在这种情况下,您实际上可以在消息进入时读取它们并将它们分桶,并且每分钟运行一次您的处理逻辑。确保同步您的存储桶,这样当新消息进来时,它们不会从您下面被更改。
但总的来说,不确定它是否会起作用