从Spring Shell执行shell命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Spring Shell执行shell命令相关的知识,希望对你有一定的参考价值。

我有一个案例,我想问我可以用Spring Shell解决。我有一个main.jar应用程序,它在Wildly服务器上部署了几个Scheduled Spring Jobs。在我的情况下,我无法停止或重新部署main.jar,因为必须不间断地提供服务。

我需要一种从终端启动/停止/重启Scheduled Spring Jobs的方法。例如在Apache Karaf中有一个我可以通过telnet使用的shell。

Spring Shell中是否有类似的解决方案,这样我就可以从linux终端执行命令了。

答案

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

您需要自己实现它。

下面是一个简单示例,说明如何使用spring shell控制计划任务并将启动/停止方法公开到命令行。

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

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流程公开这些方法。

以上是关于从Spring Shell执行shell命令的主要内容,如果未能解决你的问题,请参考以下文章

Shell 退出代码与简单命令不一致

在 unix (Minix) 源代码中执行的 shell 命令在哪里?

linux arm 运行 shell .sh 脚本文件报错:/bin/bash^M: bad interpreter: No such file or directory(dos2unix )(代码片

从 .NET 应用程序执行 shell 命令

shell从入门到精通关于内建命令(内置命令)和外建命令

Linux shell 命令cd是怎么实现的?放在哪个文件夹?