入站文件适配器+集群环境



我有一个spring集成应用程序部署在集群中的两个节点上。它们轮询单个目录(入站文件适配器)上的传入文件。如果一个节点拾取并处理了一个文件,有时另一个节点会抛出以下异常,因为它试图拾取相同的文件。

错误org.springframework.integration.handler.LoggingHandler - org.springframework.integration.MessageHandlingException: failed to write Message payload to file .....产生原因:java.io.FileNotFoundException:/somedir/dir/file.txt (No such file or directory)

我知道轮询/集群等已经到处讨论了很多。我确实在任何地方找到了一个准确的解释,我正试图清理这个,让日志更干净。提前感谢。入站文件适配器中是否有任何简单的配置来防止这种情况。

一种解决方案是使用单一源轮询目录,并使用一些中间传输(如RabbitMQ、JMS等)将工作分发给竞争的消费者。

另一个是使用FileSystemPersistentAcceptOnceFileListFilter,它使用一个ConcurrentMetadataStore,所以只有一个实例会看到每个文件。

这需要一些共享状态——框架提供了一个RedisMetadataStore作为内置选项。

最新更新