0

我正在为我的 cli 使用 spring shell 框架。我已经编写了一些命令,一旦在我的 java 应用程序中执行命令,它就会显示结果。

@CliCommand(value = "add jar", help = "adds a jar resource")
public String addJar(
    @CliOption(key = {"", "param"}, mandatory = true, help = "path to jar")          String path) {
    // code
    return result.getMessage();
}

上面的命令会在命令执行完成后尝试添加 jar 并将结果返回给 spring shell。现在,我可以将最终结果状态发送到 spring shell。我想在执行时也将执行状态发送到 spring shell。

我的用例是:有没有办法在命令运行时向 spring shell 发送定期更新,而不是一次发送整个结果?

4

2 回答 2

0

你可以在你的命令方法中做任何你想做的事情,包括写入 System.out(这将被发送给用户)。因此,对于您的特定用例,定期轮询您的执行状态并发出一条消息(甚至可能使用 ANSI 代码来覆盖以前的位置,或者使用print()而不是显示进度println()

于 2015-05-01T12:13:33.757 回答
0

您可以将记录器附加到控制台。如果您只想显示您的 log.info,您可以在日志配置中对其进行配置。例如在 logback 中:

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <!-- this is your normal logger -->
  <root level="DEBUG">
    <appender-ref ref="CONSOLE" /> 
  </root>
</configuration> 

或者,如果您想向用户显示有关状态的消息,而不是您记录的内容。抽象外壳中有一种方法可以向用户显示消息。

@Autowired
private JLineShellComponent shell;

@CliCommand(value = "check", help = "just show messages")
public void check(){
    shell.flash(java.util.logging.Level.ALL, "initializing ", "id");
    init();
    shell.flash(java.util.logging.Level.ALL, "running", "id");
    run();
    shell.flash(java.util.logging.Level.ALL, "finished", "id");
    stop();
}
于 2015-10-19T13:00:52.567 回答