如何在Spring Boot应用程序中测试Quartz作业的正常工作

我想测试一下我的Quartz触发器是否在实际中起作用。 我的Quartz配置如下:

@Configuration
public class QuartzConfiguration {

  @Bean
  public JobDetail verificationTokenRemoverJobDetails() {
    return
        JobBuilder
            .newJob(VerificationTokenQuartzRemoverJob.class)
            .withIdentity("Job for verification token remover")
            .storeDurably()
            .build();
  }

  @Bean
  public Trigger verificationTokenRemoverJobTrigger(JobDetail jobADetails) {
    return
        TriggerBuilder
            .newTrigger()
            .forJob(jobADetails)
            .withIdentity("Trigger for verification token remover")
            .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0/2 1/1 * ? *"))
            .build();
  }
}

我的Job类如下:

@AllArgsConstructor
public class VerificationTokenQuartzRemoverJob implements Job {

  private VerificationTokenRepository verificationTokenRepository;

  @Override
  public void execute(JobExecutionContext context) {
    verificationTokenRepository.deleteAllByCreatedLessThan(LocalDateTime.now().minusMinutes(30));
  }
}

当我在日志中启动我的Spring Boot应用程序时,我可以意识到Job在正常工作并周期性触发,但这不足以确认其正常工作。

这就是为什么我决定创建一个JUnit测试的原因。我找到了一个教程:click,但是所有者使用了while(true)子句,根据该主题:click不是一个可取的选择。这里出现一个问题,是否还有其他选项可以验证Job类名称,触发器的身份并检查是否尽可能频繁地调用CRON表达式和具体作业?

如果可能的话,我将感谢您提供有关如何达到理想效果的建议。

liu6130 回答:如何在Spring Boot应用程序中测试Quartz作业的正常工作

使用SpringBoot,您可以更轻松地执行以下操作

---选项1 ---

@Configuration
// This is important!
@EnableScheduling
public class Configuration{
 // TODO Change to 0 0 0/2 1/1 * ? *
 @Scheduled(cron = "0 15 10 15 * ?")
 public void scheduleTaskUsingCronExpression() {

    long now = System.currentTimeMillis() / 1000;
     System.out.println(
        "schedule tasks using cron jobs - " + now);
  }      

}

完整示例: https://www.baeldung.com/spring-scheduled-tasks

---选项2->以编程方式---

@Configuration
@EnableScheduling

public class Configuration implements SchedulingConfigurer {
   @Bean(destroyMethod = "shutdown")
   public Executor taskExecutor() {
      return Executors.newScheduledThreadPool(100);
   }

    @Override
            public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            CronTrigger cronTrigger
            = new CronTrigger("* * * * * *");

                    taskRegistrar.setScheduler(taskExecutor());
                    taskRegistrar.addTriggerTask(
                            new Runnable() {
                                @Override public void run() {
                                    System.out.println("RUN!!!");
                                }
                            },cronTrigger
                    );
                }

}

,

请注意,上面关于使用Spring Scheduling的答案有一个很大的缺点:如果仅运行应用程序的一个实例,这很好用,但是一旦扩展到多个实例,它就会变得更加复杂: 您可能希望仅在特定间隔运行一次作业,但是如果两个节点同时运行,则该作业可能在两个节点上运行(因此基本上运行了两次)。 Quartz可以处理这类情况,因为它可以有一个中央数据库,如果作业已经开始,它可以通过该数据库进行协调。 通过春季排定,作业将在两个节点上运行。

本文链接:https://www.f2er.com/3159061.html

大家都在问