2016-07-07 44 views
1

我有一個無限循環的Talend過程。我很想用一個更可控的「while」循環替換這個無限循環。我的想法是讓while循環監視一個內部變量(也許是一個上下文變量?),並在捕獲到一個Unix SIGINT信號後設置這個變量。如何才能讓Talend過程正確地捕獲SIGINT?

這可能嗎?如果是的話如何?

有沒有可行的選擇?如果在磁盤上找到該文件,則可以使用哨兵文件並停止該進程,但SIGINT處理將更清晰。

技術上,拓藍過程是一個Java應用程序,我可能會用一個custon tJava組件編寫Java代碼來妥善處理這一點。

更新

我曾嘗試使用tJava組件添加一個關閉掛鉤:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     System.out.println("Signal caught... finishing up current work and exiting."); 
     context.keepRunning = false; 
    } 
}); 

在這部分我設置context.keepRunning,這是我的循環條件false

不幸的是,這不僅運行關閉鉤子中的內容,而且還會立即退出進程。控制不會回饋到Talend流程。在循環組件之後,我有兩個tWarn組件。一個onSubjobOk和一個onSubjobError。在發送SIGINTSIGTERM信號後,兩者都不會執行。然而執行關閉鉤子的println語句。

+0

據我瞭解這些信號,他們將直接與您所指的線程一起工作。所以,如果你把這個信號發送給Java,Java將立即處理它並且一如既往地作出反應。另外一種做法是'addShutdownHook'。儘管如此,這項工作在任何狀態下都會中斷。我會使用該文件或其他任何可以從* tJava *或* tJavaRow *中使用的文件。 – tobi6

回答

1

addShutdownHook從文檔:

當虛擬機開始它的關閉序列將開始 所有已註冊的關閉掛鉤[..]。當所有的鉤子都完成後,它將會運行所有未被喚醒的終結器,如果已啓用終止退出。最後,虛擬機將會暫停 。

所以JVM啓動鉤則立即停止,任何代碼掛鉤後,所有的tJava後了Talend組件將不會被執行!

你需要的是一個信號處理程序,而不是一個鉤子。見this SO回答。

相關問題