如何使用Spring Integration File Inbound Adapter顺序处理文件

时间:2017-02-21 08:52:30

标签: spring spring-integration

我需要从源目录中读取文件并按顺序(逐个)处理它。

我有以下应用程序上下文配置,

<?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:file="http://www.springframework.org/schema/integration/file"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/integration
            http://www.springframework.org/schema/integration/spring-integration.xsd
            http://www.springframework.org/schema/integration/file
            http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">

    <int:channel id="controlChannel" />

    <int:channel id="adapterInputChanel">
        <int:queue />
    </int:channel>

    <int:control-bus input-channel="controlChannel" />

    <file:inbound-channel-adapter id="inboundAdapter"
        directory="inputdir"
        channel="adapterInputChanel" auto-startup="false" prevent-duplicates="true"
        ignore-hidden="true">
        <int:poller id="poller" fixed-delay="5000"
            max-messages-per-poll="1">
        </int:poller>
    </file:inbound-channel-adapter>


    <int:service-activator input-channel="adapterInputChanel"
        ref="mainService" method="readFiles" output-channel="filesOut">
        <int:poller fixed-delay="500" />
    </int:service-activator>

    <bean id="mainService" class="com.sample.MainService">

    </bean>

    <file:outbound-channel-adapter id="filesOut"
        directory="output dir" />

</beans>

根据上述配置,文件入站适配器将为每个轮询获取一个文件并执行服务执行程序。

但同时如果系统正在获取另一个文件,那么文件入站适配器不应该再次触发服务,直到第一个事务完成。

请通过一些示例告诉我解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

<queue/>移除adapterInputChanel,然后从服务激活器中删除<poller/>

然后,频道将是DirectChannel,您的服务将在适配器的轮询线程上运行,下一个文件将不会被处理,直到服务退出。

你可以阅读different channel types here;特别是可订阅和可投票渠道之间的区别。