AWS异步响应路由到sqs-outbound-channel-adapter的成功通道

问题描述

我已经注册AsyncHandler,并且还向SQS出站流程中添加success-channelsuccess-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" />

解决方法

<int-aws:sqs-outbound-channel-adapter>组件是单向的,因此没有outputChannel选项公开。但是目标类是AbstractMessageProducingHandler。为避免代码重复,我们在内部为该outputChannel重用了现有的AsyncHandler

在XML解析器中,我们只是将一个重新映射到另一个:

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

您可能在日志中看不到任何内容,因为您需要分别调整相应类别和级别的日志记录配置。

更新

根据我的测试,在<chain>中使用XML DSL配置这样的组件绝对是不可能的。 <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