我在实现某些功能方面遇到了问题,而且在删除文件时我注意到了一些不一致。
1)当我删除多个文件时,有时并非所有文件都被转移到正确的目录。
2)有时服务激活器在出站适配器发生文件传输之前就会命中。
3)有时它会随着.moving停滞。
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" />
答案 0 :(得分:1)
a)由于您没有fileInputChannel
的声明,因此它是DirectChanel
,这意味着这些消息将交替发送到出站适配器和服务激活器。
将其声明为<publish-subscribe-channel/>
,每个文件都会发送给两个订阅者(基于order
)。
b)由于你想将文件发送到服务,你不清楚你的意思,为什么要在它到达之前删除它?如果您的意思是,那么您可以使用ExpressionEvaluatingRequestHandlerAdvice向文件适配器添加<request-handler-advice-chain/>
。有关如何使用该建议的示例,请参阅retry-and-more sample。
c)不,由于您没有对成功或失败采取任何行动,因此不需要伪交易。