Хотите отправить результат потоковой передачи в оболочку 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()
и т. д.)