跳转到内容

基于TrantorCli开发远程命令

远程命令是基于会话命令的基础进行开发生效的,通过connect命令连接远程服务开启会话,进入会话后则是一个全新的命令,将不属于本地trantor命令的子命令。远程命令的开发与本地命令基本一致,表现上略有不同。每个远程命令实际上是一个作用域为prototypeSpringBean,Trantor sdk会将其自动注入到srping ioc容器中,每次命令都会生成一个新的TrantorCommand对象,所以远程命令必须定义在一个Spring工程内。

sdk

提供trantor-cli-server-sdk用于远程命令的开发

<dependency>
<groupId>io.terminus.trantor</groupId>
<artifactId>trantor-cli-server-sdk</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>

定义远程命令

远程命令中所涉及的抽象。

image-20211105150650972

定义远程基础命令

远程命令的定义方式与本地命令基本一致,使用的日志工具类不同,远程使用CliLogger,CliLogger本质上是一个SpringBean,通过TrantorCli管理,所以直接注入即可使用。

示例:

@Name("basic")
@Summary("this is a basic command")
@Description("EXAMPLES:\n" +
"trantor basic [arg]" +
"trantor basic -s true hhh")
public class BasicCommand extends AbstractTrantorSimpleCommand {
@Autowired
private CliLogger logger;
/**
* 命令选项
*/
private Boolean status;
/**
* 命令参数
*/
private String arg;
/**
* 定义该变量接收命令中的--status / -s选项对应的值
* 更多属性建议查看Option源码
*/
@Option(shortName = "s", longName = "status")
@DefaultValue("true")
@Description("default type is true")
public void setStatus(Boolean status) {
this.status = status;
}
/**
* 定义该变量接收命令中的第一个参数
* argName 定义变量名称
* index 定义该变量在命令中参数的下标
* 更多属性建议查看Argument源码
*/
@Argument(argName = "arg", index = 0)
@Description("arg for basic command")
public void setArg(String arg) {
this.arg = arg;
}
/**
* 返回当前命令的版本 自定义
*
* @return 当前命令的版本
*/
@Override
public String getVersion() {
return TrantorCliVersion.VERSION;
}
/**
* 获取当前命令的父命令 当没有父命令时允许返回null
*
* @return 父命令名
*/
@Override
public Class<? extends TrantorCommand> getParent() {
return null;
}
/**
* 命令的逻辑部分
*
* @return 命令的执行状态
*/
@Override
public int process() throws Throwable {
logger.info("这是一个远程基础命令,参数为{},选项为{}", arg, status);
if (status) {
logger.info("666");
}
return TerminalStatus.EXIT_NORMALITY;
}
}

图例:

image-20211104183158163

定义远程复杂命令

和本地复杂命令一致,不再赘述。

示例:

父命令:

@Name("parent")
@Summary("this is a complex command,it have a secondary command")
@Description("EXAMPLES:\n" +
"trantor parent")
public class ParentCommand extends AbstractTrantorComplexCommand {
@Autowired
private CliLogger logger;
/**
* 没有子命令输入时执行该方法
*
* @return
* @throws Throwable
*/
@Override
protected int execute() throws Throwable {
logger.info(this.usage());
return TerminalStatus.EXIT_NORMALITY;
}
/**
* 返回当前命令的版本 自定义
*
* @return 当前命令的版本
*/
@Override
public String getVersion() {
return TrantorCliVersion.VERSION;
}
/**
* 当需要个性化使用帮助时可重写该方法
*
* @return 使用帮助内容
*/
@Override
public String usage() {
StringBuilder usageStringBuilder = new StringBuilder();
UsageMessageFormatter usageMessageFormatter = new UsageMessageFormatter();
usageMessageFormatter.setOptionComparator(null);
this.getCli().usage(usageStringBuilder, usageMessageFormatter);
return usageStringBuilder.toString();
}
}

子命令

@Name("son")
@Summary("this is a secondary command")
@Description("EXAMPLES:\n" +
"trantor parent son")
public class SonCommand extends AbstractTrantorSimpleCommand {
@Autowired
private CliLogger logger;
private String arg;
@Argument(argName = "arg", index = 0)
@Description("arg for son command")
public void setArg(String arg) {
this.arg = arg;
}
@Override
public String getVersion() {
return TrantorCliVersion.VERSION;
}
@Override
public Class<? extends TrantorCommand> getParent() {
return ParentCommand.class;
}
@Override
public int process() throws Throwable {
logger.info("这里是一个远程子命令 参数是{}", arg);
if (!"hahaha".equals(arg)) {
throw new TrantorCommandProcessException(TerminalStatus.EXIT_ABNORMALLY, "参数不匹配");
}
return TerminalStatus.EXIT_NORMALITY;
}
}

图例:

image-20211104183236026

命令的返回状态

与本地命令一致,不再赘述。

命令行日志工具 (CliLogger)

MethodDescription
system设置日志级别 (ALL, TRACE, DEBUG, INFO, WARN, ERROR, OFF)
trace打印trace级别日志。
debug打印debug级别日志。
info打印info级别日志。
warn打印warn级别日志。
error打印error级别日志。

自定义展示信息

当远程会话连接成功后会展示客户端信息,如果想要自定义展示内容可实现TrantorCliServerInformation接口

@Component
public class TrantorCliDemoInformation implements TrantorCliServerInformation {
@Override
public LinkedHashMap<String, String> customDisplayMessage() {
LinkedHashMap<String, String> metastoreVersionMap = new LinkedHashMap<>();
metastoreVersionMap.put("version", TrantorCliVersion.VERSION);
return metastoreVersionMap;
}
@Override
public String clientPrompt() {
return "trantor-cli-plugin-server-demo";
}
}

实现效果如图: image-20211104183036396

部署

确认服务正常运行且开启状态,通过connect命令连接服务即可使用。

开启方式

  1. 通过在application.yml中配置 trantor.cli.server.enabled = true。
  2. 通过定义系统环境变量 TRANTOR_CLI_SERVER_ENABLED = true。

以上优先级递减,当部署在dice上时,生产环境中以上配置将不生效,无法开启。