我可以从我的入站通道适配器处理程序中发送Spring Integration Channel吗?

时间:2016-02-18 02:08:09

标签: java spring spring-integration

我希望在我的文件入站通道适配器的处理程序中发送另一个通道,如果某些条件值得信息。有时入站文件超出了规范值,我想将文件发送到错误目录,但不会中断入站流向出站,因为即使超出规范文件仍需要转到辅助位置。

我的配置示例:

<int-file:inbound-channel-adapter id="filesIn"
                                  directory="${input.path}"
                                  filename-regex="\\d{8}-\\d+\\.txt">
    <int:poller id="poller" fixed-rate="500"/>
</int-file:inbound-channel-adapter>

<int-file:file-to-string-transformer input-channel="filesIn"
                                     output-channel="strings"
                                     delete-files="true" />

<int:channel id="strings"/>
<int:channel id="errorChannel" />

<int:exception-type-router input-channel="strings"
                           default-output-channel="output">
    <int:mapping exception-type="ca.uhn.hl7v2.HL7Exception"
                 channel="errorChannel"/>
</int:exception-type-router>

<int:service-activator input-channel="output"
                               output-channel="archive"
                               ref="handler" method="handleString"/>

<int:service-activator input-channel="errorChannel"
                       output-channel="errorOutput"
                       ref="handler" method="handleError" />

<int-file:outbound-channel-adapter id="archive"
                                   directory="${archive.path}"
                                   delete-source-files="true"/>

<int-file:outbound-channel-adapter id="errorOutput"
                                   directory="${hl7.error.path}"/>

<bean id="handler" class="com.giotta.service.Hl7MessageConsumer"/>

Crude Diagram

1 个答案:

答案 0 :(得分:1)

从术语的角度来看,入站适配器没有“处理程序”。根据类型,它们可以是消息源或消息生成器。

也就是说,您可以在入站适配器后立即添加路由器,并根据您想要的任何条件路由到不同的渠道。

修改

  

在尝试将String解析为HL7消息时,Hl7MessageConsumer中抛出异常

但你现在有

...&GT;变压器 - &GT; etr-&GT; handler-&GT; ...

即。 etr在之前处理程序。

你需要像...这样的东西。

<int-file:inbound-channel-adapter id="filesIn"
                                  directory="${input.path}"
                                  filename-regex="\\d{8}-\\d+\\.txt">
    <int:poller id="poller" fixed-rate="500" error-channel="errorChannel" />
</int-file:inbound-channel-adapter>

<int-file:file-to-string-transformer input-channel="filesIn"
                                     output-channel="strings"
                                     delete-files="true" />

<int:channel id="strings"/>

<int:service-activator input-channel="strings"
                               output-channel="archive"
                               ref="handler" method="handleString"/>

<int-file:outbound-channel-adapter id="archive"
                                   directory="${archive.path}"
                                   delete-source-files="true"/>

<int:channel id="errorChannel" />

<int:service-activator input-channel="errorChannel"
                       output-channel="errorOutput"
                       ref="handler" method="handleError" />

<int-file:outbound-channel-adapter id="errorOutput"
                                   directory="${hl7.error.path}"/>

<bean id="handler" class="com.giotta.service.Hl7MessageConsumer"/>

即。轮询器捕获异常并将ErrorMessage路由到错误通道。错误消息有效内容是MessagingException,包含两个属性(causefailedMessage)。

<强> EDIT2

  

除了“errorOutput”适配器之外,我仍然希望字符串转到“archive”适配器。

在那种情况下......

<int:publish-subscribe-channel id="errorChannel" />

<int:service-activator input-channel="errorChannel"
                       output-channel="errorOutput"
                       ref="handler" method="handleError" />

<int:transformer input-channel="errorChannel"
            output-channel="archive" expression="payload.failedMessage" />