2015-05-01 28 views
0

我正在为我的cli使用弹壳框架。我写了一些命令,它会在我的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发送定期更新,而不是一次发送整个结果?

回答

0

您可以在命令方法中执行任何操作,包括写入System.out(将发送给用户)。 因此,对于您特定使用情况下,周期性地轮询您的执行的状态,并发出一个消息(甚至使用ANSI代码覆盖先前的位置,或者与print()代替println()显示进度条,

+0

嗨,谢谢你的回应。 system.print和println都能正常工作,但我的应用程序在方法中使用了log.info。我想将这些数据发布到cli而不是sysouts。 –

+0

这也应该工作,假设日志框架被正确配置为发射到标准输出 – ebottard

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