When you send an async request the response comes back as an event later. And you're right: the first tricky bit in the event handler is to match the response up to the request and figure out what to do with it. Message oriented middleware like MQ-Series and other JMS implementations use a correlation id. When you put a request on queue the software gives you a correlation id. When the response comes in it will have the same id. If your async middleware doesn't do that, you can add your own id to the request and response to match them up. I wrote a bit about solutions I've tried
HERE. Let me know if that's useful.