Java 我可以更改JMSMessageID以保证它是唯一的吗?

Java 我可以更改JMSMessageID以保证它是唯一的吗?,java,spring-boot,activemq,spring-jms,Java,Spring Boot,Activemq,Spring Jms,我正在用ActiveMQ服务器集群构建一个spring引导应用程序。为了解决消费者端的重复消息问题,所有出列的JMSMessageID都将保存在redis中,消费者将忽略redis中所有ID重复的新消息 为了实现这一点,我需要所有JMSMessageID都是唯一的。我试图在生产者代码中设置JMSMessageID,但似乎无法更改它。我的问题是,在分布式系统(多个应用程序服务器和一个ActiveMQ服务器集群)中,系统生成的JMSMessageID是唯一的吗 jmsTemplate.send(na

我正在用ActiveMQ服务器集群构建一个spring引导应用程序。为了解决消费者端的重复消息问题,所有出列的JMSMessageID都将保存在redis中,消费者将忽略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;
            }
         });


JMSMessageID由JMS提供程序设置。客户机不能按照JMS规范设置它。JMS规范确实保证了JMSMessageID的唯一性。JMS 1.1和2规范的第3.4.3节均规定:

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


发送通用消息
GenericMessage(T有效负载,映射头)
. 有效负载将是您的对象,您可以在报头中注入一些唯一的值,使用这些值可以唯一地标识消息

  MessageHeaders headers = new MessageHeaders(Collections.<String, Object>singletonMap("foo", "some unique value"));
MessageHeaders=newmessageheaders(Collections.singletonMap(“foo”,“某些唯一值”));

能否检查邮件id是否已禁用?通过类似于
getDisableMessageID
的方式。至于它的唯一性,afaik,它不是必需的(因为,它取决于提供者本身)