基于TrantorCli开发远程命令
远程命令是基于会话命令的基础进行开发生效的,通过connect命令连接远程服务开启会话,进入会话后则是一个全新的命令,将不属于本地trantor命令的子命令。远程命令的开发与本地命令基本一致,表现上略有不同。每个远程命令实际上是一个作用域为prototype的SpringBean,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>定义远程命令
远程命令中所涉及的抽象。

定义远程基础命令
远程命令的定义方式与本地命令基本一致,使用的日志工具类不同,远程使用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; }}图例:

定义远程复杂命令
和本地复杂命令一致,不再赘述。
示例:
父命令:
@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; }}图例:

命令的返回状态
与本地命令一致,不再赘述。
命令行日志工具 (CliLogger)
| Method | Description |
|---|---|
| system | 设置日志级别 (ALL, TRACE, DEBUG, INFO, WARN, ERROR, OFF) |
| trace | 打印trace级别日志。 |
| debug | 打印debug级别日志。 |
| info | 打印info级别日志。 |
| warn | 打印warn级别日志。 |
| error | 打印error级别日志。 |
自定义展示信息
当远程会话连接成功后会展示客户端信息,如果想要自定义展示内容可实现TrantorCliServerInformation接口
@Componentpublic 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"; }
}实现效果如图:

部署
确认服务正常运行且开启状态,通过connect命令连接服务即可使用。
开启方式:
- 通过在application.yml中配置 trantor.cli.server.enabled = true。
- 通过定义系统环境变量 TRANTOR_CLI_SERVER_ENABLED = true。
以上优先级递减,当部署在dice上时,生产环境中以上配置将不生效,无法开启。