当前位置: 首页 > 知识库问答 >
问题:

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

阴阳
2023-03-14

我想测试我的石英触发器是否在实践中像它假设的那样工作。我的石英配置如下所示:

@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();
  }
}

我的工作类看起来像:

@AllArgsConstructor
public class VerificationTokenQuartzRemoverJob implements Job {

  private VerificationTokenRepository verificationTokenRepository;

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

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

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

如果可能的话,我将非常感谢关于如何达到理想效果的建议。

共有2个答案

诸葛苏燕
2023-03-14

使用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
                    );
                }

}

白光耀
2023-03-14

请不要说上面关于使用Spring调度的答案有一个很大的缺点:如果您只运行应用程序的单个实例,这会很好地工作,但是一旦您扩展到多个实例,它就变得更加复杂:您可能希望在一定的时间间隔内只运行一次作业,但是如果两个节点同时运行,作业可能会在两个节点上运行(所以基本上是两次)。Quartz可以处理这种情况,因为它可以有一个中央数据库,如果作业已经启动,它可以通过该数据库进行协调。使用Spring调度,作业将在两个节点上运行。

 类似资料:
  • 现在我手动更改系统时间。例如,如果我将作业安排在2/5/2013 12:45 PM运行,那么我将系统时钟时间更改为2/5/2013 12:43 PM,然后等待几分钟,看看Quartz是否从DB接收到该作业。这对我很管用。 我不想每次需要测试时都更改系统时钟时间。有没有更好的办法做到这一点? 我注意到频繁地改变系统时间有时会使Quartz搞砸,因为有些工作没有被接上。

  • 我读过这篇文章。作者认为每个Android应用程序都应该使用代码收缩。 我使用以下代码来收缩和模糊代码,

  • 我正在尝试在我的spring应用程序中集成一个Quartz工作。我从这里得到了这个例子。该示例显示使用以重复的时间间隔执行作业,并在特定时间使用执行作业。 谢谢..

  • 问题内容: 我已经在Web应用程序中使用Guice了,没有问题,我想在桌面应用程序中使用它。我当然缺少一件事- 一种告诉我的应用程序如何绑定所有内容并知道什么是什么的方法。在Web应用程序中,我在Application类中对此进行了声明,如何在桌面应用程序中进行声明? 这是我正在使用的相关代码: 我的主班: 我当然在上projectRepo.persist(newProject); 那么,我还需要

  • 使用spring-boot时,一切工作都很好。尽管如此,在spring-boot中已删除了注释和。我试图将代码重构为新版本,但我做不到。对于以下测试,我的应用程序在测试之前没有启动,http://localhost:8080返回404: 如何重构测试以使其在Spring-Boot1.5中工作?

  • 当我用IntelliJ Idea运行它时-它完全正常工作。当我从output运行app.jar文件时--所有的东西都运行得很好,但有一个特性是由supportlib.jar支持的。使用时,我得到。输出的结构为: 类路径为: