在Spring启动应用程序中安排任务的最佳方法是什么

时间:2016-01-28 14:46:25

标签: java spring spring-mvc

我目前正在开发基于Spring-Boot的应用程序。

我知道像@Scheduled这样的注释可以安排任务。由于我的应用程序中的用户想要在不同的时间发送邮件并且只发送一次。

我已阅读帖子Spring scheduling task - run only once, 但在基于Spring的应用程序中,总是“新”的本地执行器很奇怪。

通过这种方式,一旦用户安排发送电子邮件,我就必须为他的任务“新”一名localExecutor。

那么,还有更好的方法吗?

5 个答案:

答案 0 :(得分:22)

在Spring中安排任务的最简单方法是在Spring托管bean中创建由@Scheduled注释的方法。在任何@EnableScheduling类中也需要@Configuration

Spring tutorial

答案 1 :(得分:14)

您可以在@Scheduled

中使用crontab
 private AtomicInteger counter = new AtomicInteger(0);

@Scheduled(cron = "*/2 * * * * *")
public void cronJob() {
    int jobId = counter.incrementAndGet();
    System.out.println("Job " + new Date() + ", jobId: " + jobId);
}

答案 2 :(得分:9)

您应该使用quartz-schedulersend mails at different time and send only once. - 将此作为业务逻辑添加到您的代码中。 请参阅spring boot -quartz集成 https://github.com/davidkiss/spring-boot-quartz-demo

答案 3 :(得分:1)

您可以使用Quartz Scheduler

  

Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作。任务定义为标准Java组件的作业,它们实际上可以执行您可以对其执行的任何编程操作。 Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持。

您可能会找到一些博客,说明如何在春季靴中使用石英,包括定义JobDetail,Trigger,factory ...的bean等,这些工作几乎是不堪重负的。

有一种简单的方法可以做到这一点。

您可以尝试https://github.com/mejariamol/quartz-easy。该库简化了Spring Boot框架中的Crystal Scheduler集成。我在工作中的一个项目中设置石英调度程序时想到了这一点。

  1. 通过设置注释中存在的适当字段,使用计划的注释和所需的配置来注释Job实施。
import com.indusnode.quartz.annotation.Scheduled;
...
@Scheduled(interval="5", intervalType=Scheduled.IntervalType.SEC)
class TestJob implements Job {
    //...
}
  1. 将应用程序属性qe.base-package设置为项目的基本软件包名称,该项目将包含您的所有作业实现。另外,在组件扫描中,将com.indusnode作为值添加到basePackage。
  2. 您完成了!无需定义工厂,JobDetail,触发器...等。

要使用此库,请在quartz-easy的依赖项部分中包含pom.xml工件

<dependency>
  <groupId>com.indusnode</groupId>
  <artifactId>quartz-easy</artifactId>
  <version>1.0.0</version>
</dependency>

有关详细信息,请参阅https://search.maven.org/artifact/com.indusnode/quartz-easy/1.0.0/jar

答案 4 :(得分:1)

如果您的应用中有多个@Scheduled注释的实例,则Spring @Scheduled注释将执行多次。

如果使用PCF,则可以使用PCF调度程序https://docs.pivotal.io/scheduler/1-2/using-jobs.html来避免此问题。使用任务可以解决此问题。