我目前正在用Java开发一个基于Vaadin的程序,该程序从Domino数据库中提取文档并将其写入MongoDB集合。该程序运行良好,但有一个小缺陷:
目前我还没有找到停止程序的方法;KILL";过程。我的关机挂钩/信号处理程序被完全忽略了。我已经将问题缩小到一行代码:
NotesThread.sintThread((
当我删除这一行时,钩子工作得很好,我的程序也正常关闭了。当插入线时,钩子永远不会被调用。
以下是一些示例代码:
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正如我所看到的,您正在使用DominoJNA,这是一个附带项目。它使用多米诺骨牌CAPI。它是开源的:https://github.com/klehmann/domino-jna您可以创建问题单或提出问题。BTW,函数";runWithAutoGC";在他的体内调用initThread((。此源代码链接:https://github.com/klehmann/domino-jna/blob/master/domino-jna/src/main/java/com/mindoo/domino/jna/gc/NotesGC.java