从Spring Shell执行Shell命令

时间:2019-04-11 07:24:36

标签: spring spring-boot spring-shell

我有一个要问的问题,我可以用Spring Shell解决吗? 我有一个main.jar应用程序,该应用程序在Wildly服务器上部署了几个Scheduled Spring Jobs。就我而言,我不能停止或重新部署main.jar,因为必须不间断地提供服务。

我需要一种从终端启动/停止/重新启动计划的春季作业的方法。例如,在Apache Karaf中,有一个可以通过telnet使用的外壳。

Spring Shell中是否有一些类似的解决方案,因此可以让我从linux终端执行命令。

1 个答案:

答案 0 :(得分:0)

对于简单的计划任务,spring / spring-boot中没有开箱即用的CLI控件。

您将需要自己实施。

下面是一个简单的示例,说明如何使用Spring Shell控制调度的任务并在命令行中公开start / stop方法。

让我们考虑一下所有计划任务的通用界面:

public interface WithCliControl {
    void start();
    void stop();
}

因此,一个简单的预定任务将如下所示:

@Component
public class MyScheduledTask implements WithCliControl {

    private AtomicBoolean enabled = new AtomicBoolean(true);

    @Scheduled(fixedRate = 5000L)
    public void doJob() {
        if (enabled.get()) {
            System.out.println("job is enabled");
            //do your thing
        }
    }

    @Override
    public void start() {
        enabled.set(true);
    }

    @Override
    public void stop() {
        enabled.set(false);
    }
}

和相应的CLI组件如下所示:

@ShellComponent
public class MyScheduledTaskCommands {

    private final MyScheduledTask myScheduledTask;

    public MyScheduledTaskCommands(final MyScheduledTask myScheduledTask) {
        this.myScheduledTask = myScheduledTask;
    }

    @ShellMethod("start task")
    public void start() {
        myScheduledTask.start();
    }

    @ShellMethod("stop task")
    public void stop() {
        myScheduledTask.stop();
    }
}

@ShellComponent@ShellMethod将这些方法公开给Spring Shell进程。