想要将流式传输结果发送到spring shell

时间:2015-05-01 02:35:24

标签: spring spring-shell

我正在为我的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发送定期更新,而不是一次发送整个结果?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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> 

或者,如果您要向用户显示有关状态的消息,而不是您要记录的内容。抽象shell中有一个方法,用于向用户显示消息。

@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();
}