0

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

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

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

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

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

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

提前致谢!

4

1 回答 1

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免费!如果有人有其他想法或解决方案,我真的很想知道!

于 2021-08-02T13:00:54.400 回答