【问题标题】:Can I change JMSMessageID to guarantee it to be unique?我可以更改 JMSMessageID 以保证它是唯一的吗?
【发布时间】:2020-10-09 06:24:48
【问题描述】:

我正在构建一个带有 ActiveMQ 服务器集群的 Spring Boot 应用程序。为了解决consumer端的消息重复问题,所有出队的JMSMessageID都会保存在redis中,consumer会忽略redis中所有ID重复的新消息。

为了实现这一点,我需要所有 JMSMessageID 都是唯一的。我尝试在生产者代码中设置 JMSMessageID,但似乎无法更改。我的问题是,在分布式系统中(多台应用服务器,以及一个ActiveMQ服务器集群),系统生成的JMSMessageID会不会是唯一的?

jmsTemplate.send(name, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
               Email email = new Email("l****@gmail.com", "this is test body", "test");
               ObjectMessage objectMessage = session.createObjectMessage();
               objectMessage.setJMSMessageID(customID);
               return objectMessage;
            }
         });

【问题讨论】:

  • 你能检查消息ID是否被禁用吗?通过getDisableMessageID之类的东西。至于它的唯一性,afaik,没有必要(因为它取决于提供者本身)

标签: java spring-boot activemq spring-jms


【解决方案1】:

发送通用消息GenericMessage(T payload, Map<String,Object> headers) .有效负载将是您的对象,并且您可以在标头中注入一些唯一值,您可以使用它来唯一地标识消息。

  MessageHeaders headers = new MessageHeaders(Collections.<String, Object>singletonMap("foo", "some unique value"));

【讨论】:

    【解决方案2】:

    JMSMessageID 由 JMS 提供者设置。它不能由客户端按照 JMS 规范进行设置。 JMS 规范确实保证了 JMSMessageID 的唯一性。 JMS 1.1 和 2 规范的第 3.4.3 节说:

    JMSMessageID 是一个String 值,它应该用作识别历史存储库中消息的唯一键。唯一性的确切范围由提供者定义。它至少应该涵盖提供程序的特定安装的所有消息,其中安装是一些连接的消息路由器集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2013-02-04
      • 2013-03-24
      相关资源
      最近更新 更多