Spring 集成拖尾多个文件

Spring integration tailing multiple files

我正在编写一个 spring 集成应用程序,它应该跟踪多个文件(可能多达 100 个)。我使用 OSDelegatingFileTailingMessageProducer 作为消息源,它是涉及多个过滤器和通道的管道的开始。

拖尾一个文件与通道和转换器的 XML 配置文件一起适用于此管道,但拖尾许多这些文件将意味着此 XML 配置的倍增,这并不好我眼中的编程实践。

我想我将不得不通过以编程方式构建 Spring 应用程序上下文来在 Java 中构建这些管道。还有其他选择吗?

编辑:

可能使用 BeanFactoryPostProcessor 是可行的方法: ?

我认为以编程方式创建消息生成器并将它们连接到同一个 outputChannel 是最简单的。真的没有必要每次都创建一个 Spring 应用程序上下文。只需从上下文中获取频道(例如 @AutoWired)并设置 outputChannel.

轮询适配器有点复杂,但在这种情况下,每个尾部适配器都是一个简单的单个 bean。

请务必在设置属性后调用 afterPropertiesSet()start()

但是,如果您希望每个裁缝都有唯一的下游流,那么您可以使用类似于 dynamic ftp sample 的技术,以及参数化的应用程序上下文。

我最终没有在 Spring 应用程序上下文中注册 OSDelegatingFileTailingMessageProducer 的实例,因为没有必要,正如 Gary 所建议的那样。相反,我使用了一个 ApplicationListener 并将其注册到我的 Spring 上下文中。然后我在 onApplicationEvent(...) 方法中创建了 tailers。这是一个最小版本:

public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {

  @Autowired 
  @Qualifier("outputChannel")
  private SubscribableChannel outputChannel;


  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    OSDelegatingFileTailingMessageProducer tailer = new OSDelegatingFileTailingMessageProducer();
    tailer.setOutputChannel(outputChannel);
    tailer.setFile(new File("/file/to/tail.txt"));
    tailer.setOptions("-f -n 0");
    tailer.afterPropertiesSet();
    tailer.start();
  } 
}

编辑:

此外,我们最终没有使用 OSDelegatingFileTailingMessageProducer,而是使用了 apache 中的那个,因为 tail 命令在不同风格的 Unix 上的行为不同。乍一看,我们无法识别任何性能差异。