> If I understood right, then each requesting service A (A1...An) should
> maintain its own unique correlation id (permanent during the connection's
> life). 

My initial suggestion was actually to have a unique correlation-id for each 
request.  This provides greater granularity than the above proposal, but has 
the overhead of creating/destroying a consumer for every request.  In short, my 
initial suggestion wasn't a very good one (especially if you're processing a 
very large volume of request/response messages).

I realized that not having access to temporary queues is actually not a very 
big limitation as long as you can provide unique queues for the services that 
are making the request.  If you read about the suggested way to implement 
request-response 
(http://activemq.apache.org/how-should-i-implement-request-response-with-jms.html),
 you'll see that temporary queues are not strictly required.  You have to be 
sure to include the reply-to destination in the request, and then you know 
which destination to check for the response.  Since we don't have access to 
temporary destinations, we simply make sure that destination exists before 
making requests.  So the requesters A1, A2, and A3 might create the following 
queues:

/queue/responses.A1
/queue/responses.A2
/queue/responses.A3

Then, when A1 makes a request, it sets the reply-to header to 
"/queue/responses.A1", and then checks that queue for the response.    Of 
course, we can still use the correlation-id to correlate the requests and 
responses.  The benefit of using the temporary queue is that the queue is 
destroyed when the consumer unsubscribes.  So without temporary queues, we need 
to have a  finite number of requesters with some way to uniquely identify 
themselves.  If this requirement cannot be met, then our queue creation could 
easily get out of control.  In other words, we could end up with thousands of 
queues of the form /queue/responses.{ID}.  This can cause problems with 
resource usage (memory and threads).

If your particular use case can't provide a limited number of unique services, 
I can think of two possible solutions:
1.) Set your broker config so that it doesn't create previous queues when 
starting up, then set up a cron job (or windows task schedule) to restart the 
broker nightly or weekly.  This is the cheap solution and would require that 
you don't need persistence.
2.) Create a broker plugin that destroys any queues that matches 
/queue/responses.* when the consumer unsubscribes.  This is the better 
long-term solution, and it's essentially mimicking temporary queue behaviour.   

Hope that helps, 

JLuna


> -- 
> View this message in context: 
> http://www.nabble.com/Implement-request-response-with-JMS-over-Stomp-tp24914033p24919423.html
> Sent from the ActiveMQ - User mailing list archive at Nabble.com.



      

Reply via email to