Лучший способ реализовать этот шаблон с JMS (который я в любом случае нашел) - это создать предварительно настроенную тему для ответных сообщений и использовать селекторы корреляции в ответном сообщении, чтобы клиент мог получить правильный один.
Более подробно, это означает установку случайного идентификатора в сообщении запроса (используя setJMSCorrelationID()
) и помещение этого сообщения в очередь запросов. Получатель этого сообщения-запроса обрабатывает его, создает ответное сообщение, устанавливает тот же идентификатор корреляции в ответном сообщении и помещает его в тему ответа. Тем временем клиент прослушивает тему ответа с помощью выражения селектора, которое указывает ожидаемый идентификатор корреляции.
Опасность заключается в том, что ответное сообщение отправляется раньше, чем клиент успевает его прослушать, хотя это, вероятно, маловероятно. Вы можете попробовать использовать предварительно настроенную Очередь для ответов, а не для темы, но я обнаружил, что темы, как правило, работают более надежно (мой поставщик JMS - HornetQ - ваш пробег может отличаться).
Все это говорит мне, что JMS очень плохо подходит для модели запрос / ответ. API просто не поддерживает его должным образом. В этом нет ничего удивительного, поскольку JMS никогда не использовался.
Что-то вроде вычислительной сетки (терракота, гигапространства, Infinispan и т. Д.), Вероятно, даст лучшие результаты, но на самом деле это не вариант для вас.