Хотите отправить результат потоковой передачи в оболочку Spring

Я использую Spring Shell Framework для моего 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 после завершения выполнения команды. Прямо сейчас я могу отправить статус окончательного результата в оболочку пружины. Я хотел отправить статус выполнения также в оболочку Spring во время выполнения.

Мой пример использования: есть ли способ отправлять периодические обновления в оболочку Spring во время выполнения команды вместо одновременной отправки всего результата?

2 ответа

Вы можете добавить свой логгер в консоль. Если вы хотите, чтобы отображался только ваш 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();
}

Вы можете делать все что угодно внутри вашего командного метода, включая запись в System.out (которая будет отправлена ​​пользователю). Поэтому, для вашего конкретного случая использования, периодически опрашивайте статус вашего выполнения и отправляйте сообщение (возможно, даже используя коды ANSI, чтобы перезаписать предыдущую позицию, или отобразите индикатор выполнения с print() вместо println()и т. д.)

Другие вопросы по тегам