我有一個無限循環的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
。在發送SIGINT
或SIGTERM
信號後,兩者都不會執行。然而執行關閉鉤子的println
語句。
據我瞭解這些信號,他們將直接與您所指的線程一起工作。所以,如果你把這個信號發送給Java,Java將立即處理它並且一如既往地作出反應。另外一種做法是'addShutdownHook'。儘管如此,這項工作在任何狀態下都會中斷。我會使用該文件或其他任何可以從* tJava *或* tJavaRow *中使用的文件。 – tobi6