Spring JMS: настройка многопользовательского клиента

Я разрабатываю клиент на основе Spring JMS, который подключается к IBM MQ.

Эта часть работает нормально !!

Сценарий:

Клиент MQ может получить запрос от нескольких Spring "@Components". Учитывая, что "отправить" и "получить" JMSTemplate - это совершенно разные методы -

Вопрос:

Как мы соотносим ответ от компонента-один только с его запросом? например

A отправляет запрос-A

B отправляет запрос-B

Как SpringListener узнает, что нужно ответить response-A на A и response-B на B?

Предоставляет ли Spring готовые функции для обработки такого сценария?

Заранее спасибо !!

Образец слушателя:

public class MessageReceiver implements MessageListener {

    @Override
    public void onMessage(Message message) {

        if(message instanceof TextMessage){
            System.out.println(message.toString());
        }
    }
}

Образец отправителя:

public class App 
{
    public static void main( String[] args )
    {

        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        JmsTemplate jmsTemplate = (JmsTemplate)context.getBean("jmsTemplate");

        jmsTemplate.send(s -> s.createTextMessage("TestingAMQ"));
    }
}

person Deep    schedule 14.11.2017    source источник


Ответы (2)


на основе заголовка JMSReplyTo вы можете сделать это с JmsTemplate.sendAndReceive для отправителя

и в слушателе рядом

    public class MessageReceiver implements MessageListener {

        @Override
        public void onMessage(Message message) {
            jmsTemplate.send(message.getJMSReplyTo(), s -> s.createTextMessage("TestingAMQ"));
            if(message instanceof TextMessage){
                System.out.println(message.toString());
            }
        }
   }

ИЛИ

Установив свойство Message на стороне отправителя с помощью Message.setStringProperty и используя селекторы в прослушивателе или условный ответ на основе свойства StringProperty.

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html#sendAndReceive-org.springframework.jms.core.MessageCreator -

person Hassen Bennour    schedule 14.11.2017
comment
Метод sendAndReceive создает временную очередь для ответа (согласно документации jmsTemplate). Message.setStringProperty кажется хорошей идеей... но разве метод не должен быть синхронизирован? Если метод не синхронизирован — новый поток может изменить значение «свойства» в методе. - person Deep; 14.11.2017
comment
Другой вариант может заключаться в том, чтобы сделать отправку + получение транзакционным. Хотя я не уверен, как это может быть реализовано. - person Deep; 14.11.2017
comment
Отправьте сообщение и получите ответ от указанного адресата (согласно документации jmsTemplate), поскольку вы передаете его в качестве параметра методу sendAndReceive, пункт назначения может быть любого типа и создан до - person Hassen Bennour; 14.11.2017
comment
почему новый поток может изменить значение свойства в методе? ваше сообщение создается и отправляется только одним потоком - person Hassen Bennour; 14.11.2017
comment
Спасибо @Hassen Bennour .... Я нашел ссылку на предложенный вами подход setProperty! - person Deep; 15.11.2017
comment
Пожалуйста, не забудьте поставить галочку, чтобы удалить его из очереди без ответа - person Hassen Bennour; 16.11.2017

Обнаружено, что это подход "setProperty" -

https://codedependents.com/2010/03/04/synchronous-request-response-with-activemq-and-spring/

person Deep    schedule 15.11.2017