JMS重写消息

JMS重写消息,jms,rabbitmq,activemq,message-queue,Jms,Rabbitmq,Activemq,Message Queue,我知道JMS消息是不可变的。但我有一个任务要解决,需要用实体id重写队列中的消息。可能系统设计有问题,请帮助我 应用程序A向JMS发送消息(实体id为1)。应用程序B每分钟检查一次新消息 应用程序A可能会在一分钟内发送多条实体id为1的消息,但应用程序B应该只看到最后一条 可能吗 应用程序A应该尽可能快地工作,所以我不喜欢在推送新消息之前执行removeMatchingMessages(字符串选择器)的想法 IMO该方法存在缺陷 即使您确实接受在写入新消息之前通过使用消息选择器删除实体id=1

我知道JMS消息是不可变的。但我有一个任务要解决,需要用实体id重写队列中的消息。可能系统设计有问题,请帮助我

应用程序A向JMS发送消息(实体id为1)。应用程序B每分钟检查一次新消息

应用程序A可能会在一分钟内发送多条实体id为1的消息,但应用程序B应该只看到最后一条

可能吗

  • 应用程序A应该尽可能快地工作,所以我不喜欢在推送新消息之前执行removeMatchingMessages(字符串选择器)的想法

IMO该方法存在缺陷

即使您确实接受在写入新消息之前通过使用消息选择器删除实体id=1的所有消息来清除队列,时间也会成为一个问题:无论哪个进程写入过期消息,都可能需要在写入新消息之前完成某种程度的同步

我能想到的另一个解决方案是在处理消息之前读取所有消息。每一分钟,线程都会接收消息并将其还原。较早的实体id=1消息将被较新的消息替换,因此最后您将有一组唯一的消息要处理。然后你处理它们。当然,现在您可能一次在内存中有太多的消息,事务性被抛出窗口,但它可能实现您想要的

在这种情况下,您实际上可以在消息传入时读取消息并对其进行压缩,然后每分钟运行一次处理逻辑。确保你同步了你的存储桶,这样当新消息进来时,它们就不会从你下面被改变

但总的来说,不确定它是否会起作用