I'm currently trying to send a bunch of simple messages to a queue with plain 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);
}
I send N messages in a row and logs show that JMSMessageId is always generated the same.
[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
etc.
As far as I know JMSMessageId is supposed to be unique and it's collision causes problems.
O'Reily book states:
The JMSMessageID is a String value that uniquely identifies a message. How unique the identifier is depends on the vendor. The JMSMessageID can be useful for historical repositories in JMS consumer applications where messages need to be uniquely indexed. Used in conjunction with the JMSCorrelationID, the JMSMessageID is also useful for correlating messages: String messageid = message.getJMSMessageID();
So, why is MessageId not unique? (it's even the same between application runs).