【发布时间】:2019-08-22 11:18:05
【问题描述】:
我目前正在尝试使用纯 java 将一堆简单消息发送到队列。
public AtomicReference<Message> doSend(String message, String queue){
try (JMSContext context = connectionFactory.createContext()) {
TextMessage textMessage = context.createTextMessage(message);
final AtomicReference<Message> msg = new AtomicReference<>();
msg.set(textMessage);
log.info("Sending message to queue {}", queue);
context.createProducer().send(createDestination(context, queue), textMessage);
log.info("Message sent to queue {}, messageId provided {}", queue, msg.get().getJMSMessageID());
return msg;
}
catch (Exception e) {
log.error("Failed to send message to queue",e);
throw new SipJmsException("Failed to send message to queue", e);
}
}
private Destination createDestination(JMSContext context, String queue){
log.debug("Creating destination queue {} connection",queue);
return context.createQueue(queue);
}
我连续发送 N 条消息,日志显示 JMSMessageId 始终生成相同。
[main] Sending message to queue TEST_QUEUE
[main] Message sent to queue TEST_QUEUE, messageId provided ID:414d5120444556494d53514d20202020551c3f5d81619824
[main] Sending message to queue TEST_QUEUE
[main] Message sent to queue TEST_QUEUE, messageId provided ID:414d5120444556494d53514d20202020551c3f5d83619824
等等。
据我所知,JMSMessageId 应该是唯一的,它的冲突会导致问题。
O'Reily 书中指出:
JMSMessageID 是一个唯一标识消息的字符串值。标识符的唯一性取决于供应商。 JMSMessageID 对于需要对消息进行唯一索引的 JMS 消费者应用程序中的历史存储库很有用。 与 JMSCorrelationID 一起使用时,JMSMessageID 对于关联消息也很有用: String messageid = message.getJMSMessageID();
那么,为什么 MessageId 不是唯一的? (在应用程序运行之间甚至相同)。
【问题讨论】: