如何使Talend进程正确捕获SIGINT?

时间:2016-07-07 06:51:46

标签: java linux talend

我有一个带有无限循环的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。发送SIGINTSIGTERM信号后,都没有执行任何一个。然而,执行了关闭钩子中的println语句。

1 个答案:

答案 0 :(得分:1)

来自addShutdownHook docs:

  

当虚拟机开始关闭序列时,它将启动   所有已注册的关闭钩子[..]。当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器。最后,虚拟机将   停止。

所以JVM启动钩子然后立即停止,钩子之后的任何代码和tJava之后的所有Talend组件都不会被执行!

你需要的是信号处理程序而不是钩子。请参阅this SO回答。