2

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

错误 org.springframework.integration.handler.LoggingHandler - org.springframework.integration.MessageHandlingException:无法将消息有效负载写入文件.....原因:java.io.FileNotFoundException:/somedir/dir/file.txt(否这样的文件或目录)

我知道轮询/聚类等已在各处进行了很多讨论。确实在任何地方都找到了准确的解释。我正在尝试清理它并保持日志更清洁。提前谢谢。入站文件适配器中是否有任何简单的配置来防止这种情况。

4

1 回答 1

2

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

另一种方法是使用FileSystemPersistentAcceptOnceFileListFilter,它使用 a ConcurrentMetadataStore,因此只有一个实例会看到每个文件。

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

于 2014-08-23T13:58:16.793 回答