2015-04-17 53 views
5

我正在編寫一個彈簧集成應用程序,應該拖尾多個文件(可能多達100個)。我正在使用OSDelegatingFileTailingMessageProducer作爲消息源,這是包含多個過濾器和通道的管道的開始。彈簧集成拖尾多個文件

尾隨一個文件可以正常工作,這個流水線包含通道和變換器的XML配置文件,但是拖尾很多這些文件將意味着這個XML配置的增加,這在我看來並不是很好的編程實踐。

我想我將不得不在Java內部通過編程構建Spring應用程序上下文來構建這些管道。還有其他選擇嗎?

編輯:

可能使用的BeanFactoryPostProcessor是要走的路:https://stackoverflow.com/a/15773000/2069922

回答

4

我認爲以編程方式創建消息生成器並將它們連接到相同的outputChannel是最容易的。每次都沒有必要創建一個Spring應用程序上下文。只需從上下文中獲取頻道(例如@AutoWired)並設置outputChannel即可。

輪詢適配器有點複雜,但在這種情況下,每個尾適配器是一個簡單的單一的豆。

設置屬性後請務必調用afterPropertiesSet()start()。但是,如果您想爲每個零售商提供一個唯一的下游流,那麼您可以使用類似於dynamic ftp sample的技術,以及參數化的應用程序上下文。

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上的不同口味。一見鍾情,我們無法確定任何性能差異。