Интеграция Spring - адаптер канала против шлюза (AMQP) - PullRequest
0 голосов
/ 16 мая 2018

Я запутался в разнице между адаптерами канала и шлюзами в весенней интеграции.Как указано в https://stackoverflow.com/a/29992267/467944 от @ gary-russell, адаптеры каналов являются однонаправленными, а шлюзы - двунаправленными.Если это так, то почему существует входящий шлюз amqp, а также исходящий шлюз amqp?

В итоге я пытаюсь выполнить следующее:

  1. Http-запрос, полученный в контроллере
  2. поместить сообщение в очередь amqp
  3. потребитель принимает сообщения и помещает результат в очередь результатов
  4. результат поступает в контроллер

таким образом, я предполагаю, что мне нужен шлюз с интерфейсом, который вызывается из контроллера и помещает полезную нагрузку в очередь amqp (настроенную как его канал запроса), в то время как он слушает свой ответ на своем канале ответа.Однако с этой конфигурацией я всегда получаю

MessageDeliveryException: Dispatcher has no subscribers for channel 'application.fromRabbit'

, где fromRabibbit - моя очередь ответов.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Спасибо @ Гари-Расселу за понимание. Я думаю, что у меня есть правильный конфиг сейчас:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/integration/amqp http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!-- 'CLIENT' SIDE CONFIG -->
    <int:channel id="clientToRabbit" />
    <int:channel id="clientFromRabbit" />
    <int:gateway id="uppercaseGateway" service-interface="com.example.queuing.UpperCaseService" default-request-channel="clientToRabbit" />
    <int-amqp:outbound-gateway request-channel="clientToRabbit"  amqp-template="amqpTemplate" exchange-name="si.test.exchange" routing-key="si.test.binding" />


    <!-- 'SERVER' SIDE CONFIG -->
    <int:channel id="serverFromRabbit" />
    <int:channel id="serverToRabbit" />
    <int-amqp:inbound-gateway request-channel="serverFromRabbit" reply-channel="serverToRabbit" queue-names="si.test.queue" amqp-template="amqpTemplate" connection-factory="connectionFactory" />
    <int:service-activator input-channel="serverFromRabbit" output-channel="serverToRabbit" ref="upperCaseService" method="toUpperCase" />


    <!-- Infrastructure -->
    <rabbit:connection-factory id="connectionFactory" host="localhost" />

    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />

    <rabbit:admin connection-factory="connectionFactory" />

    <rabbit:queue name="si.test.queue" />
    <rabbit:direct-exchange name="si.test.exchange">
        <rabbit:bindings>
            <rabbit:binding queue="si.test.queue" key="si.test.binding" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
</beans>
0 голосов
/ 16 мая 2018

Вы должны всегда показывать конфигурацию, когда задаете такие вопросы.

У диспетчера нет подписчиков ...

Это ошибка конфигурации, когда вы неправильно подключили поток интеграции.

В Spring Integration есть два типа шлюзов -

Шлюзы для взаимодействия с внешними системами

Они предоставляют семантику запроса / ответа с внешними системами.

Входящие шлюзы предназначены для запроса / ответа на стороне сервера, когда сервер получает запрос, выполняет некоторую обработку и возвращает ответ.

Исходящие шлюзы являются эквивалентом на стороне клиента, где клиент отправляет запрос и ожидает ответа. С AMQP у нас есть асинхронная версия, в которой ответ возвращается в другом потоке.

Шлюзы обмена сообщениями

Эти основанные на интерфейсе шлюзы предоставляют шлюз (обычно запрос / ответ, но метод с недействительным результатом - односторонний) из кода Java (а не какой-либо внешней системы).

Это позволяет устаревшему Java-коду использовать интеграционный поток.

Так что вы могли бы ...

controller -> gateway -> transformer(optional) -> amqp-outbound-gateway

... это обычная модель и хорошо работает.

На стороне сервера может быть

amqp-inbound-gateway -> service-activator

Покажите ваш код / ​​конфигурацию, и кто-то может помочь отладить проблему конфигурации.

...