如何在Spring Shell应用中动态管理命令的可用性?
如何在Spring Shell应用中动态管理命令的可用性?
嘿,我来给你唠唠怎么在Spring Shell里动态管控命令的可用性!你现在有5个各自独立类的命令a至e,还有个Foo类,刚好可以借助这些条件来灵活控制命令能不能用,具体操作可以这么来:
一、用Foo类做全局状态管理
首先把Foo变成一个全局的状态持有者,用来统一控制所有命令的可用状态——毕竟你已经有这个类了,刚好物尽其用。比如在Foo里加个状态变量,再配上判断和修改状态的方法:
@Component public class Foo { // 这里可以换成你实际的业务判断条件,比如是否完成初始化、是否具备权限等 private boolean commandsEnabled = true; // 供命令类调用的可用性判断方法 public boolean isCommandsAvailable() { // 这里可以扩展成更复杂的动态逻辑,比如读配置、查外部服务状态 return commandsEnabled; } // 提供修改状态的方法,用来触发可用性变化 public void updateCommandStatus(boolean enabled) { this.commandsEnabled = enabled; } }
二、给每个命令绑定可用性判断
接下来在你的A、B、C、D、E这几个命令类里,用Spring Shell的@ShellAvailability注解,把命令的可用性和Foo的状态绑定起来。拿A命令举个例子:
@ShellComponent public class ACommand { private final Foo foo; // 构造注入Foo,这样就能拿到全局状态 public ACommand(Foo foo) { this.foo = foo; } // 定义这个命令的可用性判断方法 @ShellAvailability(provider = "aCommandAvailability") public Availability aCommandAvailability() { if (foo.isCommandsAvailable()) { return Availability.available(); } else { // 这里可以写友好的提示,告诉用户为啥命令不可用 return Availability.unavailable("命令a当前不可用,请先完成前置初始化操作"); } } // 你的实际命令方法 @ShellMethod(key = "a", value = "执行命令a的业务逻辑") public String executeA() { return "命令a执行完成!"; } }
其他B到E命令类都可以照搬这个模式,把可用性判断和Foo的状态关联起来,这样就能一键全局控制所有命令的开关了。
三、加个动态切换状态的管理命令
如果需要在CLI里手动触发状态切换,你可以再加个管理类,做一个专门的命令来修改Foo的状态:
@ShellComponent public class CommandControl { private final Foo foo; public CommandControl(Foo foo) { this.foo = foo; } @ShellMethod(key = "toggle-commands", value = "切换所有业务命令的可用状态") public String toggleCommandStatus(@ShellOption(defaultValue = "true") boolean enable) { foo.updateCommandStatus(enable); return "所有业务命令已设置为:" + (enable ? "可用" : "不可用"); } }
这样你在CLI里输入toggle-commands false,所有绑定了Foo状态的命令就都会变成不可用,输入toggle-commands true又能恢复,完全动态可控。
四、给单个命令做独立的可用性控制
如果你想给某个命令单独设置判断逻辑,不跟着全局状态走,也很简单——直接在对应命令类里写独立的可用性判断就行。比如给B命令设置“仅在工作时间可用”:
@ShellComponent public class BCommand { // 单独的可用性判断,不依赖Foo @ShellAvailability(provider = "bCommandAvailability") public Availability bCommandAvailability() { LocalTime now = LocalTime.now(); boolean isWorkTime = now.isAfter(LocalTime.of(9, 0)) && now.isBefore(LocalTime.of(18, 0)); if (isWorkTime) { return Availability.available(); } else { return Availability.unavailable("命令b仅在9:00-18:00之间可用"); } } @ShellMethod(key = "b", value = "执行命令b的业务逻辑") public String executeB() { return "命令b执行完成!"; } }
这样不管全局状态怎么变,B命令都只按自己的时间逻辑来判断可用性,非常灵活。
内容来源于stack exchange
相关产品推荐
相关产品推荐

