如何使用spring shell在spring Boot Web应用程序中构建控制台命令?(3)如何使用参数和选项(在评论中回答问题)

我已经使用弹簧启动Web启动器创建了restfull Web应用程序,效果很好。我可以通过网址访问它。

但是我需要创建控制台命令,该命令可以在后端计算和存储一些值。我希望能够手动或通过bash脚本运行控制台命令。

我找不到任何关于如何在spring Boot Web应用程序中集成spring-shell项目的文档。

此外,在弹簧启动器中也没有选择弹簧壳依赖性的选项 https://start.spring.io/

1)Web应用程序和控制台是否需要是两个独立的应用程序,我需要单独部署它们?

2)是否可以在同一应用程序中部署Web应用程序并运行控制台命令?

3)在shell和Web应用程序之间共享通用代码(模型,服务,实体,业务逻辑)的最佳方法是什么?

任何人都可以帮忙吗?


答案 1

这里有2个选项:

(1) 从命令行调用的 Rest API

您可以创建一个 Spring ,然后从命令行调用它?@RestController

curl -X POST -i -H "Content-type: application/json" -c cookies.txt -X POST http://hostname:8080/service -d '
    {
        "field":"value",
        "field2":"value2"
    }
    '

您可以轻松地将其嵌入到一个漂亮的shell脚本中。

(2) 使用 spring-boot-remote-shell(已弃用)

虽然它主要用于监视/管理目的,但您可以使用spring-boot-remote-shell来实现此目的。

依赖

您需要以下依赖项才能启用远程 shell:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
<dependency>
    <groupId>org.crsh</groupId>
    <artifactId>crsh.shell.telnet</artifactId>
    <version>1.3.0-beta2</version>
</dependency>

时髦脚本

在 中添加以下脚本:src/main/resources/custom.groovy

package commands

import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext

class custom {

    @Usage("Custom command")
    @Command
    def main(InvocationContext context) {
        return "Hello"
    }
}

要从这个时髦的脚本中获取Spring Bean(来源:https://stackoverflow.com/a/24300534/641627):

BeanFactory beanFactory = (BeanFactory) context.getAttributes().get("spring.beanfactory");
MyController myController = beanFactory.getBean(MyController.class);

启动您的春季靴应用程序

在类路径上使用 spring-boot-remote-shell 时,Spring Boot 应用程序会在端口 5000 上侦听(默认情况下)。您现在可以执行以下操作:

$ telnet localhost 5000
Trying ::1...
Connected to localhost.
Escape character is '^]'.
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.3.5.RELEASE)

帮助

您可以键入以查看可用命令的列表:help

NAME       DESCRIPTION                                                                                                                                                                 
autoconfig Display auto configuration report from ApplicationContext                                                                                                                   
beans      Display beans in ApplicationContext                                                                                                                                         
cron       manages the cron plugin                                                                                                                                                     
custom     Custom command                                                                                                                                                              
dashboard                                                                                                                                                                              
egrep      search file(s) for lines that match a pattern                                                                                                                               
endpoint   Invoke actuator endpoints                                                                                                                                                   
env        display the term env                                                                                                                                                        
filter     A filter for a stream of map                                                                                                                                                
help       provides basic help                                                                                                                                                         
java       various java language commands                                                                                                                                              
jmx        Java Management Extensions                                                                                                                                                  
jul        java.util.logging commands                                                                                                                                                  
jvm        JVM informations                                                                                                                                                            
less       opposite of more                                                                                                                                                            
log        logging commands                                                                                                                                                            
mail       interact with emails                                                                                                                                                        
man        format and display the on-line manual pages                                                                                                                                 
metrics    Display metrics provided by Spring Boot                                                                                                                                     
shell      shell related command                                                                                                                                                       
sleep      sleep for some time                                                                                                                                                         
sort       Sort a map                                                                                                                                                                  
system     vm system properties commands                                                                                                                                               
thread     JVM thread commands 

调用我们的自定义命令

我们的自定义命令已列出(顶部第四个),您可以调用它:

> custom
Hello

因此,从本质上讲,您的crontab将执行并执行telnet 5000custom

(3)如何使用参数和选项(在评论中回答问题)

参数

要使用参数,您可以查看文档

class date {
  @Usage("show the current time")
  @Command
  Object main(
     @Usage("the time format")
     @Option(names=["f","format"])
     String format) {
    if (format == null)
      format = "EEE MMM d HH:mm:ss z yyyy";
    def date = new Date();
    return date.format(format);
  }
}

% date -h
% usage: date [-h | --help] [-f | --format]
% [-h | --help]   command usage
% [-f | --format] the time format

% date -f yyyyMMdd

子命令(或选项)

从他们的文档来看

@Usage("JDBC connection")
class jdbc {

  @Usage("connect to database with a JDBC connection string")
  @Command
  public String connect(
          @Usage("The username")
          @Option(names=["u","username"])
          String user,
          @Usage("The password")
          @Option(names=["p","password"])
          String password,
          @Usage("The extra properties")
          @Option(names=["properties"])
          Properties properties,
          @Usage("The connection string")
          @Argument
          String connectionString) {
     ...
  }

  @Usage("close the current connection")
  @Command
  public String close() {
     ...
  }
}

% jdbc connect jdbc:derby:memory:EmbeddedDB;create=true

最后一个命令执行:

  • 命令jdbc
  • 与子命令connect
  • 和参数jdbc:derby:memory:EmbeddedDB;create=true

完整示例

以下内容包括:

  • 构造函数;
  • 带有参数的命令;
  • 一个弹簧管理的豆子;
  • 带有参数的子命令。

代码:

package commands

import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext
import org.springframework.beans.factory.BeanFactory
import com.alexbt.goodies.MyBean

class SayMessage {
    String message;
    SayMessage(){
        this.message = "Hello";
    }

    @Usage("Default command")
    @Command
    def main(InvocationContext context, @Usage("A Parameter") @Option(names=["p","param"]) String param) {
        BeanFactory beanFactory = (BeanFactory) context.getAttributes().get("spring.beanfactory");
        MyBean bean = beanFactory.getBean(MyBean.class);
        return message + " " + bean.getValue() + " " + param;
    }

    @Usage("Hi subcommand")
    @Command
    def hi(InvocationContext context, @Usage("A Parameter") @Option(names=["p","param"]) String param) {
        BeanFactory beanFactory = (BeanFactory) context.getAttributes().get("spring.beanfactory");
        MyBean bean = beanFactory.getBean(MyBean.class);
        return "Hi " + bean.getValue() + " " + param;
    }
}

> saymsg -p Johnny
> Hello my friend Johnny

> saymsg hi -p Johnny
> Hi my friend Johnny

答案 2

听起来您在这里有两个不同的用例:运行计划任务和手动运行命令。根据我的理解,Spring Shell不是Boot生态系统的一部分。你可以编写一个位于 Boot Web 应用外部的 Spring Shell 应用程序,但它不会嵌入其中。至少从我的经验来看。

对于计划任务的第一种情况,您应该查看Spring的计划程序。您应该能够配置包含任务计划程序的Spring应用程序(引导或普通)。然后,您可以配置可以计划的任务,让计划程序完成工作。

对于手动执行命令,您在此处有几个选项。如果使用 Spring Shell,则假定它在自己的进程中运行,该进程位于 Spring Boot 进程的外部。您需要使用远程方法调用技术(例如,RMI,REST等)将Shell应用程序调用到Boot应用程序(假设这是您想要工作的地方)。

Spring Shell 的另一种方法是将远程 shell 嵌入到引导应用程序中。从本质上讲,您可以使用SSH连接到Boot应用程序,并以与Spring Shell类似的方式定义命令。好处是这与引导应用程序处于同一进程中。因此,您可以注入任务计划程序并手动运行与计划相同的任务。如果您想手动执行正在计划的相同任务,这可能是一个不错的选择。远程控制台的Doco在这里

希望这有帮助


推荐