This took some experimenting.
My problem: I am using Spring Framework 3.0 JMS support to wire up a JMS listener container to listener beans. The XML syntax looks like:
<jms:listener-container>
<jms:listener
destination="hard-coded-queue-name"
ref="listener"/>
</jms:listener-container> This XML is distributed with each program instance. Not a single single server or client instance but a server cluster or client farm: each one of these needs a unique destination so JMS routes correctly.
My first try fixed the uniqueness problem but was less than fully usable:
<jms:listener-container>
<jms:listener
destination="#{T(java.util.UUID).randomUUID().toString()}"
ref="listener"/>
</jms:listener-container> This suffers excess cleverness. Each listener gets a random UUID for its destination. But, how does the listener refer to this queue name when filling in a JMS reply-to field, or logging or other purposes?
The real answer is to ask the listener for a destination, no produce one externally:
<jms:listener-container>
<jms:listener
destination="#{listener.inbox}"
ref="listener"/>
</jms:listener-container> And in the listener:
private final String inbox = UUID.randomUUID().toString();
public String getInbox() {
return inbox;
}