我有一个无限循环的 Talend 进程。我很想用更可控的“while”循环来替换这个无限循环。我的想法是让 while 循环监视一个内部变量(也许是上下文变量?)并在捕获到 Unix SIGINT 信号后设置此变量。
这可能吗?如果是怎么办?
是否有可行的替代方案?如果在磁盘上找到该文件,我可以使用哨兵文件并停止进程,但 SIGINT 处理会更干净。
从技术上讲,Talend 进程是一个 Java 应用程序,我可能会使用自定义 tJava
组件来编写 Java 代码来正确处理这个问题。
更新
我尝试使用 tJava
组件添加关闭钩子(Hook):
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
。
不幸的是,这样不仅运行了shutdown hook中的内容,还立即退出了进程。控制权不会交还给 Talend 进程。我在循环组件之后有两个 tWarn
组件。一个 onSubjobOk
和一个 onSubjobError
。在发送 SIGINT
或 SIGTERM
信号后都不会执行。然而来自关闭 Hook 的 println
语句被执行。
最佳答案
来自 addShutdownHook文档:
When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks [..]. When all the hooks have finished it will then run all uninvoked finalizers if finalization-on-exit has been enabled. Finally, the virtual machine will halt.
因此 JVM 启动 Hook 然后立即停止, Hook 之后的任何代码和 tJava
之后的所有 Talend 组件都不会执行!
您需要的是信号处理程序而不是 Hook 。参见 this所以回答。
关于java - 如何让 Talend 进程正确捕获 SIGINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239149/