自定义JMS消息的JMSMessageID不起作用

时间:2017-12-15 17:36:57

标签: jmstemplate

我试图在推送到Azure Queue之前自定义JMSMessageID,由于某种原因,这个id没有进入队列,而是我看到针对MessageID生成的随机ID。当我调试代码时,我可以看到messageID已正确设置,直到调用MessageProducer.send(message)。我们正在使用spring框架JMSTemplate。有人可以帮忙吗?

 jmsTemplate.send(destination, new MessageCreator() {
 public Message createMessage(Session session) throws JMSException {
    TextMessage message = session.createTextMessage();
    message.setText(message);
    message.setJMSMessageID("ID:" + "MessageId + "1");
    System.out.println("Message Id: " + message.getJMSMessageID()); 
    return message;
  } 
}

2 个答案:

答案 0 :(得分:0)

对于JMS规范,您尝试做的是非法的,"JMSMessageID"无法更改/设置。

来自javadoc:

void setJMSMessageID(String id)throws JMSException
    Sets the message ID.

    This method is for use by JMS providers only to set this field when a message is sent. 
    This message cannot be used by clients to configure the message ID. 
    This method is public to allow a JMS provider to set this field when sending a message whose implementation is not its own.

来自API javadoc here

的参考

答案 1 :(得分:0)

某些JMS消息标头属性由JMS代理设置,而不是由客户端应用程序设置。例如JMSTimestamp和JMSMessageID。 JMS代理本身确保此ID是唯一的,因此您无法在客户端应用程序中控制它。一旦它处理它并且找出一个唯一的ID,它将被JMS Broker覆盖。

如果要为邮件分配ID,请使用JMSCorrelationID标头属性。