我有一个带有无限循环的Talend进程。我喜欢用更可控的"替换这个无限循环。"环。我的想法是让while循环监视一个内部变量(可能是一个上下文变量?)并在捕获Unix SIGINT信号后设置这个变量。
这可能吗?如果是的话怎么样?
有可行的替代方案吗?我可以使用sentinel文件并停止进程,如果在磁盘上找到该文件但SIGINT处理更清晰。
从技术上讲,Talend进程是一个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
语句。
答案 0 :(得分:1)
来自addShutdownHook docs:
当虚拟机开始关闭序列时,它将启动 所有已注册的关闭钩子[..]。当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器。最后,虚拟机将 停止。
所以JVM启动钩子然后立即停止,钩子之后的任何代码和tJava
之后的所有Talend组件都不会被执行!
你需要的是信号处理程序而不是钩子。请参阅this SO回答。