java - 无论操作系统如何,用 Java 执行计划任务的最佳解决方案是什么?

标签 java service cron scheduled-tasks

我想在我的 Java 桌面应用程序上生成警报:

  • 设置了特定日期/时间的闹钟,可以是 5 分钟或 5 个月内
  • 我需要能够在触发警报时创建 SWT 应用程序
  • 我需要它能够在任何操作系统上工作。软件用户可能使用 Windows(其中 90%),其余使用 Mac OS(包括我)
  • 软件许可必须允许我在商业程序中使用它,而不需要开源(因此,没有 GPL)
  • 我不能要求用户安装 Cygwin,因此实现需要原生于 Windows 和 Unix

我正在使用 Java、Eclipse、SWT 进行开发,我的应用程序是使用 Java Web Start 从我的服务器部署的。我正在使用 Mac OS X.6 进行开发。


我想我有几个选择:

  1. 在启动时运行我的应用程序,并自己处理所有事情;
  2. 使用系统服务。
  3. 在 Unix 上使用 cron 表,在 Windows 上使用计划任务

启动时运行

我不太喜欢这个解决方案,我希望有更优雅的东西。
引用:I would like to run my Java program on System Startup on Mac OS/Windows. How can I do this?

系统服务

如果我将它作为系统服务运行,我可以从中受益,因为操作系统将确保我的软件:

  • 一直在运行
  • 没有/不需要 GUI
  • 失败重启

我研究了一些我可以使用的资源:

  • run4j — CPL — 仅在 Windows 上运行,似乎是一个有效的候选者
  • jsvc — Apache 2.0 — 仅限 Unix,似乎是一个有效的候选者
  • Java Service Wrapper — 各种 — 我买不起付费许可证,免费的是 GPL。因此,我不想/不能使用这个

我在系统服务选项中的问题是:

  1. 还有其他选择吗?
  2. 我计划的实现是否正确:

    • 在应用程序启动时,检查服务是否存在
    • 如果没有安装:
      • 升级用户安装服务(Unix 为 root,Windows 为 UAC)
      • 如果主机操作系统是Windows,使用run4j注册服务
      • 如果主机操作系统是Unix,使用jsvc注册服务
    • 如果没有运行,启动它

因此,在第一次运行时,应用程序将安装服务并启动它。当应用程序关闭时,服务仍在运行并且不再需要该应用程序,除非它未注册。
但是,我想我仍然怀念“启动时运行”功能。

我说的对吗?我错过了什么吗?

cron/任务计划程序

在 Unix 上,我可以轻松地使用 cron 表,而无需应用程序将用户升级为 root。我不需要处理重启、系统日期更改等。看起来不错。

在 Windows 上,我可以使用 Task Scheduler , 即使在命令行中使用 AtSchTasks .这看起来不错,但我需要它兼容从 XP 到 7,我不能轻易测试它。


那你会怎么做呢?我错过了什么?您有什么建议可以帮助我选择最佳和最优雅的解决方案吗?

最佳答案

Bicou:很高兴您分享了您的解决方案!

请注意“schtasks.exe”有一些本地化问题,如果你想用它创建每日触发器,在英语 Windows 上你必须使用“daily”,在德语 Windows 上(例如)你必须改用“täglich”。

为了解决这个问题,我使用 /xml 选项实现了对 schtasks.exe 的调用,提供了一个我通过模板创建的临时 xml 文件。

创建此类模板的最简单方法是“手动”创建任务并使用任务管理 GUI 工具中的“导出”功能。

关于java - 无论操作系统如何,用 Java 执行计划任务的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898647/

相关文章:

amazon-web-services - EB Worker cron.yaml - 无权执行 : dynamodb:UpdateItem

java - 将框架设置为不可见时,为什么此代码会产生错误?

Java - 在所有线程完成后等待初始化 Activity

java - 无法在 Android 中创建 CSV 文件,总是失败

android - 使用 Retrofit 库通过通知处理多个下载

Android - 将 Activity 和小部件绑定(bind)到服务

android - 在服务中调用 getIntent 方法

linux - 您使用cron做什么?

java - 带分页的 API 的 Stream 与 Iterator

linux - 当从 cron 调用脚本时,脚本中的 Sed 命令不起作用