java - 如何让 Talend 进程正确捕获 SIGINT?

标签 java linux talend

我有一个无限循环的 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。在发送 SIGINTSIGTERM 信号后都不会执行。然而来自关闭 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/

相关文章:

java - 静态变量中的guice注入(inject)

java - 对于 GMail,通过 Android Intent 发送附加到电子邮件的 zip 文件失败

Linux 脚本,从 CSV 文件获取条目并将其写入配置文件 freeRADIUS

linux - 管道重定向到 shell 文件的限制?

integration - 如何在talend集成中检索重复记录

java - Kafka Connect - 文件源连接器错误

arrays - Bash:awk 输出到数组

multithreading - 在 Talend 中同时运行具有不同上下文参数的同一子作业

etl - Talend 中 twarn 和 tassert 之间的区别

java - 如何使对话框中的整个 View 可点击?