【问题标题】:Cli java app that schedule a task, leave free the cmd/terminal and at sheduled time do the task安排任务的 Cli java 应用程序,释放 cmd/终端并在预定时间执行任务
【发布时间】:2021-10-07 08:58:44
【问题描述】:

我正在尝试在 java 中使用 spring 和 picocli 进行 cli 应用程序,您可以在 cmd 上启动它,并通过对话框进行一些配置来编写任务,(在这种情况下,显示“警报消息”) cmd。)我使用了 Timer 和 TimerTask 并且它可以工作,但是在应用程序执行此任务并完成之前,我无法在 cmd 上执行任何其他操作。

我希望配置任务,完成此配置对话框,能够使用命令行执行任何其他操作,并在预定的日期和时间在 cmd 上打印一条消息,或者每 XX 分钟打印一条循环消息。

我花了很多时间试图搜索解决方案,但可能这是不可能的......

我认为可能是一个很好的解决方案的其他选项是一种在 cmd 中的任何位置使用自定义命令(作为环境变量)并与在后台运行的应用程序持续交互的方法。这样,cmd 将只是一种在后台从该应用程序发送或接收信息的通信方式。

但同样,我也没有找到任何方法来做到这一点。

有没有办法做这两个选项中的任何一个,或者你有其他想法来完成这个任务?

提前致谢!

【问题讨论】:

  • 有趣的问题。不,我认为在纯 Java 中不可能像您描述的那样。也许会有一些操作系统特定的支持。这是哪个操作系统?您希望它在多个操作系统上运行吗?
  • 我正在尝试在 Windows 上运行它,如果可能的话,我当然希望它适用于所有操作系统!今天早上我有一个想法,我把它作为答案放在下面。它不那么雄心勃勃,但它确实有效。

标签: java background command-line-interface timertask picocli


【解决方案1】:

我找到了解决这个问题的替代方案,但没有那么雄心勃勃。我把它留在这里,以防有人遇到类似问题。

它包括制作一个带有警报功能的小新程序,并通过参数发送计划任务的日期和时间,在计划的时间,应用程序将发送带有警报的 jOptionpanel:

public class Alarm {

    public static void main(String[] args) {
        String alarmDate = args[0];
        String alarmTime = args[1];

        LocalDateTime taskTime = LocalDateTime.parse(alarmDate + "T" + alarmTime);
        Date taskTimeAsDate = Date.from(taskTime.atZone(ZoneId.systemDefault()).toInstant());

        Timer timer = new Timer();
        timer.schedule(setAlarm("Wake Up! Wake Up!"), taskTimeAsDate);  
    }

    private static TimerTask setAlarm(String message) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                Component Jframe = null;
                JOptionPane.showMessageDialog(Jframe, message, "Alarm Ringing", JOptionPane.PLAIN_MESSAGE);
                System.exit(0);
            }
        };
        return timerTask;
    }
}

我使用 ProcessBuilder 从 cli 应用程序调用 jar:

    public void setAlarm(String alarmDate, String alarmTime) throws IOException {   
        ProcessBuilder timer = new ProcessBuilder("java","-jar", "Alarm.jar", alarmDate, alarmTime);
        timer.start();
    }

通过这种方式,警报被安排并且cmd免费!如果有人有其他想法或解决方案,我真的很想知道!

【讨论】: