spring integration - 从FTP读取文件并进行处理。如何在没有轮询的情况下实现Metastore并对其进行处理

时间:2015-02-08 15:43:30

标签: java spring ftp spring-integration

在Spring集成中 - 我试图从FTP读取文件并处理它。如何在没有轮询的情况下实现Metastore并对其进行处理。 在下面的配置中,为了避免读取同一个文件,如果服务器重启,我在ftpChannel中引入了message-store。 现在,文件的处理器是服务激活器,需要轮询。如何避免在服务激活器中轮询并立即从ftpChannel队列中读取文件。如果我使用int:dispatcher那么,我就不能使用message-store。

我们如何解决这个问题?

<int:channel id="ftpChannel">
    <int:queue message-store="mongoDbMessageStore" />
    <!-- <int:dispatcher task-executor="taskExecutor"/> -->
</int:channel>

<bean id="mongoDbMessageStore"
    class="org.springframework.integration.mongodb.store.MongoDbMessageStore">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    <constructor-arg name="collectionName" value="ftpInfo" />
</bean>

<int-ftp:inbound-channel-adapter id="ftpInbound"
    channel="ftpChannel" session-factory="ftpClientFactory" charset="UTF-8"
    auto-create-local-directory="true" delete-remote-files="false"
    filename-pattern="*.gz" remote-directory="/myfilerepo/#{istDate.getISTDate()}"
    remote-file-separator="/" local-filename-generator-expression="#this.toUpperCase()"
    temporary-file-suffix=".writing" preserve-timestamp="true"
    local-directory="/temp/spring/#{istDate.getISTDate()}">

     <int:poller cron="0-5 0/5 * * * ?" max-messages-per-poll="-1"/>
</int-ftp:inbound-channel-adapter>

<int:service-activator id="jobServiceActivator"
    input-channel="ftpChannel" ref="triggerJobLauncher" method="launch">
    <int:poller fixed-delay="10" />
</int:service-activator>

<!-- job context -->
<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="transactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>
<!-- job context -->

2 个答案:

答案 0 :(得分:2)

您在频道上不需要message-store;您需要使用filter中的FtpPersistentAcceptOnceFileListFilter和/或local-filter中的FileSystemPersistentAcceptOnceFileListFilter来避免在系统重新启动后重新处理文件。

他们需要MetadataStore; 如果你想使用mongo,你需要实现一个;该框架目前还没有mongo实现。

编辑:

从版本4.2开始,框架now has a mongo MetadataStore

答案 1 :(得分:0)

根据您的关注to avoid reading the same file from the QueueChannel,我要说您担心Spring Application会在应用程序启动后始终处理相同的消息。但这不是真的。当消息从那里MessageStore时,消息将从队列中移除(当然,也可以从polled)。如果MessageStore是事务性资源(例如JDBC),则会将消息记录标记为删除,直到TX提交或回滚。 但是对于MongoDB来说并非如此,但是即使你有这样一个应用程序的集群,队列中的任何消息都只被轮询一次。

所以,我不明白你为什么确定你的<service-activator>接受同一个文件(payload),因为你重启了应用程序。

另一方面,如果您想访问MessageGroup支持的ftpChannel,可以执行以下操作:

mongoDbMessageStore.getMessageGroup("mongoDbMessageStore:ftpChannel");

从另一方面,您始终可以purge QueueChannel手动注入ftpChannel作为QueueChannelOperations的某些服务。