Я недавно исследовал Spring Integration и AMQP (RabbitMQ), так как мне нужно связать два приложения (промежуточное ПО и бэкэнд) с помощью асинхронного подхода, чтобы промежуточное ПО не блокировалось при получении клиентских вызовов.
Сначала я применил более простой подход - реализовать это в синхронном режиме, это означает, что у меня есть интерфейс шлюза и шлюз исходящей почты (с requireReply = true) на промежуточном программном обеспечении, а затем шлюз входящей почты и активатор службы на бэкэнде. Этот первоначальный подход работает хорошо (я использовал XML-конфигурацию Spring Integration).
Теперь мне нужно пояснить, как сделать эту работу асинхронной.
Посмотрев на RabbitMQ Tutorial 6, лучше работать с очередью обратного вызова и correlationId, и, насколько я понял, это будет похоже на вызов Spring RabbitTemplate convertAndSend () и затем receive () вместо convertSendAndReceive () (который будет заблокирован до получения ответа).
Я проверил документы Spring Integration, где мне нужно заменить интерфейс шлюза на промежуточном программном обеспечении, чтобы он возвращал Future или ListenableFuture.
После этого я также просмотрел документацию для исходящий шлюз, где говорится, что он может работать вместе с RabbitTemplate для управления атрибутами сообщения correlationID и replyTo.
Мои вопросы:
- Чтобы эта работа работала с использованием асинхронного подхода, следует ли мне продолжать работать со шлюзами исходящей / входящей почты, а не с конвертерами исходящих / входящих сообщений?
- В случае использования подхода конвертеров исходящих / входящих сообщений (который мне кажется похожим на то, что показано в учебнике RabbitMQ), как мне связать Future на интерфейсе шлюза с результатом, возвращаемым с помощью адаптера входящего канала?