Spring集成拖尾多个文件

时间:2015-04-17 12:58:34

标签: java spring spring-integration

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

Tailing一个文件可以正常使用这个管道和一个用于通道和转换器的XML配置文件,但是拖尾许多这些文件意味着这个XML配置的倍增,这在我看来并不是很好的编程实践。

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

编辑:

可能需要使用BeanFactoryPostProcessor:https://stackoverflow.com/a/15773000/2069922

2 个答案:

答案 0 :(得分:4)

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

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

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

但是,如果您想为每个分类器提供唯一的下游流,那么您可以使用类似于dynamic ftp sample的技术,并使用参数化的应用程序上下文。

答案 1 :(得分:0)

我最终没有使用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上表现不同。乍一看,我们无法确定任何性能差异。