Маршрутизация AWS Async Response в канал успеха для адаптера sqs-outbound-channel

Я зарегистрировал AsyncHandler, а также добавил success-channel в исходящий поток SQS. success-channel имеет конечную точку int:logging-channel-adapter. Однако я не могу видеть журналы с этого адаптера. AsyncHandler может получать обратные вызовы, но ничего на success-channel. В SqsMessageHandler я вижу, что мы устанавливаем выходной канал в методе obtainAsyncHandler, но я нигде не видел установленного success-channel. Я что-то упускаю? Я бы предпочел использовать каналы успеха и неудачи, а не обратный вызов AsyncHandler Impl, чтобы избежать использования кода, специфичного для AWS, в моих классах.

Также мой <int-aws:sqs-outbound-channel-adapter> находится внутри <int:chain>, у которого нет выходного канала, поскольку поток заканчивается, когда сообщение отправлено.

РЕДАКТИРОВАТЬ - добавлена ​​конфигурация. Это единственный способ заставить его регистрировать обратный вызов.

    <int:channel id="chainChannel" />
    <int:channel id="successChannel" />
    <bean class="ServiceTransformer" id="serviceTransformer" />
    <int:chain input-channel="serviceChannel" id="sendToServiceSqsChain" output-channel="chainChannel">
        <int:transformer ref="serviceTransformer" method="transform" />
        <int:header-filter header-names="config" />
        <int-aws:sqs-outbound-channel-adapter sqs="amazonSQS" queue="some-queue" async-handler="sqsPublishCallbackHandler" success-channel="successChannel"/>
    </int:chain>

    <int:logging-channel-adapter log-full-message="true" channel="chainChannel" />

Здесь я могу просто использовать один и тот же канал как в цепочке (исходящий канал), так и в sqs-outbound (успешный канал)

Не удалось заставить его работать, как показано ниже:

        <int:channel id="successChannel" />
        <bean class="ServiceTransformer" id="serviceTransformer" />
        <int:chain input-channel="serviceChannel" id="sendToServiceSqsChain" >
            <int:transformer ref="serviceTransformer" method="transform" />
            <int:header-filter header-names="config" />
            <int-aws:sqs-outbound-channel-adapter sqs="amazonSQS" queue="some-queue" async-handler="sqsPublishCallbackHandler" success-channel="successChannel"/>
        </int:chain>
    
        <int:logging-channel-adapter log-full-message="true" channel="successChannel" />

person Nikhil    schedule 24.08.2020    source источник


Ответы (1)


Компонент <int-aws:sqs-outbound-channel-adapter> односторонний, поэтому параметр outputChannel не доступен. Однако целевой класс AbstractMessageProducingHandler. Чтобы избежать дублирования кода, мы повторно используем существующий outputChannel внутри для этого AsyncHandler.

В парсере XML мы просто переназначаем одно на другое:

IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "success-channel", "outputChannel");

Вероятно, вы ничего не видите в журналах, потому что вам нужно настроить конфигурацию журналов соответственно для соответствующей категории и уровня.

ОБНОВЛЕНИЕ

Согласно моему тестированию, определенно невозможно настроить такой компонент с XML DSL в <chain>. Этот <int-aws:sqs-outbound-channel-adapter> должен быть представлен за пределами <chain>.

Вместо этого рассмотрите возможность перехода на Java DSL: https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/dsl.html#java-dsl.

person Artem Bilan    schedule 24.08.2020
comment
Я думаю, проблема в том, что мой ‹int-aws: sqs-outbound-channel-adapter› находится внутри цепочки ‹int: без выходного канала›. Следовательно, сообщение не направляется в канал успеха. Он (канал успеха) работает только тогда, когда я добавляю выходной канал в цепочку. Как справиться с этим сценарием, не создавая выходной канал в цепочке ‹int:›? - person Nikhil; 24.08.2020
comment
Переместите его за пределы chain. Было бы здорово увидеть вашу конфигурацию для подтверждения. В противном случае это все домыслы - person Artem Bilan; 24.08.2020
comment
Я добавил конфигурацию через РЕДАКТИРОВАНИЕ к основному вопросу, прошу вас просмотреть его. - person Nikhil; 25.08.2020
comment
В ПОРЯДКЕ. Так или иначе. Как это работает, если он настроен вне chain? - person Artem Bilan; 25.08.2020
comment
См. ОБНОВЛЕНИЕ в моем ответе. - person Artem Bilan; 25.08.2020
comment
Спасибо за обновления. Вне «цепочки» работает нормально. Я попробую подход DSL. Просто подумайте - в качестве улучшения должна ли структура откатиться, чтобы создать новый канал успеха, когда существующий канал вывода не найден? - person Nikhil; 25.08.2020
comment
Это не связано. Цепочка имеет логику для установки своих внутренних каналов в обработчики для пересылки. Итак, все, что мы предоставляем, отменяется - person Artem Bilan; 25.08.2020