Как получить аннотации cron метода, аннотированного @schedule во время выполнения в Spring? - PullRequest
0 голосов
/ 29 января 2019

У меня есть приложение Spring, которое использует

@SpringBootApplication

и

@EnableScheduling

в основной Java.Также у него есть класс с несколькими методами @Scheduled:

@Component

public class ScheduledTasks {

(...)

@Scheduled(cron = "0 0/5 10-18 ? * *")    
public void doThings() {
(...)
}

@Scheduled(cron = "0 0/22 23 ? * *")    
public void doAnotherThings() {
(...)
}

Насколько я знаю, он не объявляет какой-либо специальный пул потоков, ThreadPoolExecutor или тому подобное.Приложение работает нормально, а запланированные задания работают нормально.

Я хотел бы получить значения аннотации @Scheduled в runTime, просто чтобы узнать, когда был определен cron, и показать информацию пользователю.

НЕ обязательно изменять или добавлять новые задачи / задания в планировщик.

Я пробовал некоторые идеи в этом ответе Как работает Springобъекты, представленные во время выполнения? пытается получить autowired ThreadPoolExecutor или ThreadPoolTaskExecutor, а затем пытается определить, содержит ли поле этого объекта полезную информацию, но при их получении с помощью Autowired всегда происходит сбой при запуске приложения.

Мое приложениетакже говорит при запуске «Не найден bean-компонент TaskScheduler / ScheduledExecutorService для запланированной обработки», поэтому я предполагаю, что он использует стандартный / простой способ запуска запланированных методов, они работают нормально.

Я не знаю, нужно ли этовручную создать @Bean с этим объектом в классе @Configuration, чтобы проанализировать его, или как заполнить конструктор, связанный с ними.

Какой объект имеет информацию, связанную с заданиями расписания?

Могу ли я автоматически связать его в своем классе, чтобы получить информацию?

Необходимо ли создавать его вручную с помощью @Bean в Spring?Как?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Начиная с Spring 5.0.2 , он позволяет получать информацию о задаче расписания во время выполнения:

В настоящее время я получил это как метод Set getScheduledTasks () в ScheduledAnnotationBeanPostProcessor, с ScheduledTask, выставляющим метод Task getTask () теперь.Затем вы можете проверить тип задачи, и для более легкого обнаружения я также ввел определенные подклассы FixedRateTask и FixedDelayTask, которые вы можете затем проверить рядом с CronTask, не требуя дополнительных метаданных помимо самого экземпляра Task.

У меня будет еще один проход через это;быть совершенным сегодня вечером.

ScheduledTask хранится в бобе ScheduledAnnotationBeanPostProcessor.Вы можете получить их из этого bean-компонента и привести его к CronTask, чтобы получить выражение cron:

@Component
public class SchedulederInfo {

   @Autowired
   private ScheduledAnnotationBeanPostProcessor scheduledBpp;

   public void printInfo(){
        for(ScheduledTask task : scheduledBpp.getScheduledTasks()) {
          Task t = task.getTask();
          if(t instanceof CronTask) {
              CronTask cronTask = (CronTask)t;
              System.out.println(cronTask.getRunnable());   //print the schedule method name 
              System.out.println(cronTask.getExpression()); //print the cron expression
          }
   }
}
0 голосов
/ 29 января 2019

Аннотации считаются метаданными вашего кода.Вы не должны взаимодействовать с аннотациями - только библиотека, предоставляющая.Но просто извлеките интересующее выражение cron и прочитайте его где-нибудь еще.

@Scheduled(cron = "${yourConfiguration.cronExpression}")
someMethod()...

@Value("${yourConfiguration.cronExpression}")
String cronExpression;  // injected for debugging purposes

Вы также можете получить TaskScheduler и сделать так, чтобы он перечислял все задачи, включая все выражения cron.Но это будет за пределами контекста вашего метода.

...