我正在编写一个弹簧集成应用程序,它应该包含多个文件(可能多达100个)。我使用OSDelegatingFileTailingMessageProducer作为消息源,这是涉及多个过滤器和通道的管道的开始。
Tailing一个文件可以正常使用这个管道和一个用于通道和转换器的XML配置文件,但是拖尾许多这些文件意味着这个XML配置的倍增,这在我看来并不是很好的编程实践。
我想我必须通过以编程方式构建Spring应用程序上下文来在Java中构建这些管道。还有其他选择吗?
编辑:
可能需要使用BeanFactoryPostProcessor:https://stackoverflow.com/a/15773000/2069922?
答案 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上表现不同。乍一看,我们无法确定任何性能差异。