Spring Cloud Task - поддержка нескольких контекстов приложения - PullRequest
0 голосов
/ 06 апреля 2020

Похоже, что жизненный цикл Spring Cloud Task неправильно управляется, когда приложение весенней загрузки имеет иерархические контексты приложения.

Когда я добавляю аннотацию @EnableTask в родительский ApplicationContext, она регистрирует задачу, но записывает время выполнения из родительский контекст, не в состоянии записать точное время выполнения и код выхода (всегда успешно, поскольку родительский контекст закрывается успешно).

С другой стороны, если я добавляю аннотацию к дочернему контексту (который фактически запускает CommandlineRunner), он завершается неудачно чтобы запустить задачу вообще, за исключением следующего:

o.s.c.t.listener.TaskLifecycleListener : [] [] An event to end a task has been received for a task that has not yet started.
s.c.a.AnnotationConfigApplicationContext : [] [] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 132515 not found

Глядя на источник TaskLifecycleListener, выясняется, что он реагирует на ApplicationEvents из родительского контекста и перехватывает ApplicationReadyEvent из родительского контекста до запуска задачи.

Spring Boot 2.2.6 / Spring Cloud Task 2.2.2

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

На самом деле я понял, что Spring автоматически настраивает задачу в моем главном родительском контексте, который закрывает задачу. И то же самое происходит в контексте моего ребенка. Так как executeId передается как параметр, он уже обновляется родительским элементом как выполненный, поэтому в моем дочернем контексте он не выполняется.

Решение, которое я обнаружил, заключалось в том, чтобы исключить автоконфигурацию SimpleTaskAutoConfiguration из моего родительского контекста.

@SpringBootApplication(exclude = {SimpleTaskAutoConfiguration.class})

Вместо этого я вручную импортирую класс конфигурации в свой дочерний контекст, который выполняет задачу:

@EnableTask
@Import(SimpleTaskAutoConfiguration.class)

Теперь он отслеживает фактическое время, которое потребовалось для выполнения программы запуска командной строки как задачи в дочернем контексте, хотя он не учитывает время запуска всего приложения, по крайней мере он отражает более точную картину.

0 голосов
/ 06 апреля 2020

Это по замыслу. «Задача» регистрируется как одно выполнение загрузочного приложения, а не как ApplicationContext. В мире микросервисов вы хотели бы разбить свои задачи на независимые артефакты, поэтому запускайте их как независимые приложения Spring Boot. Spring Cloud Task не поддерживает несколько «задач» в одном приложении Spring Boot, поскольку это противоречит его намерениям. Если вы считаете, что это что-то, что нужно добавить, не стесняйтесь, чтобы открыть проблему на Github, где мы можем подробнее изучить ваш сценарий использования.

...