Spring集成出站文件适配器

时间:2015-07-08 02:15:07

标签: spring spring-integration

我在实现某些功能方面遇到了问题,而且在删除文件时我注意到了一些不一致。

1)当我删除多个文件时,有时并非所有文件都被转移到正确的目录。

2)有时服务激活器在出站适配器发生文件传输之前就会命中。

3)有时它会随着.movi​​ng停滞。

a)因此,通过查看下面的代码,它是否正确设置?

b)如何在服务激活器命中之前确保删除源文件。

c)交易代码是否必要?

<!-- Adapter for reading files in the incoming directory -->
<int-file:inbound-channel-adapter id="incomingFileAdapter"
                                  channel="fileInputChannel"
                                  prevent-duplicates="false"
                                  scanner="recursiveDirectoryScanner"
                                  filename-regex="^.*\.(?i)(avi|divx|xvid|flv|f4v|mkv|m1v|m2v|m4v|mpeg|mpg|mp4|mov|vob|wmv|asf|ts|mxf)$"
                                  directory="${file.listener.path.incoming}">
    <int:poller id="filePoller" default="true" max-messages-per-poll="5" fixed-rate="5000">
        <int:transactional transaction-manager="pseudoTransactionManager" />
    </int:poller>
</int-file:inbound-channel-adapter>

<!-- Adapter for writing files to the processed directory -->
<int-file:outbound-channel-adapter id="processedFileAdapter"
                                   mode="REPLACE"
                                   channel="fileInputChannel"
                                   delete-source-files="true"
                                   auto-create-directory="true"
                                   order="1"
                                   directory-expression="@dynamicDirectoryGenerator.generateDirectory(payload)" />

<int:service-activator
        input-channel="fileInputChannel"
        output-channel="nullChannel"
        order="2"
        ref="fileInputActivator"
        method="processMessage"/>

<bean id="fileInputActivator" class="com.nfl.dm.shield.ingestion.file.activator.FileInputActivator" />
<bean id="recursiveDirectoryScanner" class="org.springframework.integration.file.RecursiveLeafOnlyDirectoryScanner" />
<bean id="dynamicDirectoryGenerator" class="com.nfl.dm.shield.ingestion.file.dynamic.DynamicDirectoryGenerator" />
<bean id="pseudoTransactionManager" class="org.springframework.integration.transaction.PseudoTransactionManager" />

1 个答案:

答案 0 :(得分:1)

a)由于您没有fileInputChannel的声明,因此它是DirectChanel,这意味着这些消息将交替发送到出站适配器和服务激活器。

将其声明为<publish-subscribe-channel/>,每个文件都会发送给两个订阅者(基于order)。

b)由于你想将文件发送到服务,你不清楚你的意思,为什么要在它到达之前删除它?如果您的意思是,那么您可以使用ExpressionEvaluatingRequestHandlerAdvice向文件适配器添加<request-handler-advice-chain/>。有关如何使用该建议的示例,请参阅retry-and-more sample

c)不,由于您没有对成功或失败采取任何行动,因此不需要伪交易。