问题描述
我目前正在用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