java - Java 程序如何检测到 MacOS 机器正在关闭?
问题描述
我有一个 Java 应用程序,每当我启动机器时,我想在我的 Mac 上启动它。每当机器关闭时,应用程序都应该正常关闭。
我在 main 方法中添加了一个关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(scheduler)));
ShutdownHook
类看起来像这样:
public class ShutdownHook implements Runnable {
private final static Logger LOGGER = LoggerFactory.getLogger("Shutdown Hook");
private final Scheduler scheduler;
public ShutdownHook(Scheduler scheduler) {
this.scheduler = scheduler;
}
@Override
public void run() {
LOGGER.debug("Starting to shot down the application");
try {
scheduler.shutdown();
} catch (final SchedulerException e) {
LOGGER.error("An error occurred while trying to shut down the scheduler", e);
}
LOGGER.info("Exiting the shutdown hook");
}
}
然后我将应用程序构建到一个可执行的 JAR 中,并将其添加到“登录项”列表中。
该应用程序在我登录时启动。
但是,机器关闭时不会执行关闭挂钩。
如何确保当我使用下面显示的菜单项关闭机器时,正在运行的 Java 应用程序检测到机器正在关闭?
更新1:
据我了解,修复错误的一种方法是使用launchd
启动 Java 程序。我在下面写了plist
文件。
下一个问题是如何确保launchd
运行该plist
文件中描述的应用程序?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ExitTimeOut</key>
<integer>300</integer>
<key>StandardErrorPath</key>
<string>/Users/XXXXXX/sw/wordcounter-daemon/error</string>
<key>Label</key>
<string>com.dpisarenko.wordcounterdaemon</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-jar</string>
<string>/Users/XXXXXXX/sw/wordcounter-daemon/wordcounter-daemon-0.1-jar-with-dependencies.jar</string>
</array>
</dict>
</plist>
解决方案
推荐阅读
- html - 使用 css 将 div 移动到其上方的行中
- google-chrome - 使用 chrome/headless chrome 运行测试时出现许多 chrome 图标
- javascript - 如何在不接受此道具的组件中传递“onChange”?
- swift - 当应用程序快速进入后台模式时如何使socket.io保持活动状态?
- python-3.6 - 如何修复在 django 中创建超级用户的错误?
- c# - 在实体框架中实现条件的哪种方式具有更好的性能?
- sql - 将表名作为参数传递
- php - 从 windows 系统邮件发送正常,但托管到 centos 后,邮件以加密格式发送
- javascript - 追加点击事件
- nagios - Nagios 核心监控有时不适用于 RHEL6.9 中新添加用户拥有的目录