使用HCL Domino NotesThread时将忽略Java关闭挂钩?

问题描述

我目前正在用Java开发基于Vaadin的程序,该程序将从Domino数据库提取文档并将其写入MongoDB集合。该程序运行正常,但有一个小缺陷:

目前,我找不到其他方法来停止程序,而是将“ KILL”发送到进程。我的关闭挂钩/信号处理程序被完全忽略。我已将问题缩小为一行代码

NotesThread.sinitThread();

当我删除此行时,该钩子可以正常工作,并且我的程序已正确关闭。当插入行时,永远不会调用该钩子。

这是一些示例代码

private boolean running = true;

...

@Override
public void run() {
    try {
        NotesGC.runWithAutoGC(() -> {
            NotesThread.sinitThread() // --> "Kills" all signal handling
            Session session = NotesFactory.createSession();
            
            while (running) {
                Thread.sleep(1000);
                System.out.println("Running ...");
            }

            session.recycle();

            return null;
        });
    } catch (Exception e) {
    } finally {
        NotesThread.stermThread();
    }
}

public void kill() {
        System.out.println("Killed!");
        this.running = false;
}

...

Signal.handle(new Signal("TERM"),sig -> runner.kill()); // Signal handler from main-method

我问过朋友和同事,没有人遇到过同样的问题。

解决方法

NotesGC.runWithAutoGC 如我所见,您正在使用Domino JNA,一个辅助项目。 它使用多米诺骨牌CAPI。 它是开源的:https://github.com/klehmann/domino-jna 您可以创建问题单或提出问题。 顺便说一句,函数“ runWithAutoGC”在他的体内调用了initThread()。 此源代码链接:https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/main/java/com/mindoo/domino/jna/gc/NotesGC.java