繁体   English   中英

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

[英]What is best way to schedule task in spring boot application

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

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

我已经阅读了帖子Spring 调度任务 - 只运行一次,但是在基于 Spring 的应用程序中总是“新建”一个 localExecutor 是很奇怪的。

这样,一旦用户安排发送电子邮件,我必须为他的任务“新建”一个 localExecutor。

那么,有没有更好的办法呢?

在 Spring 中调度任务最简单的方法是在 spring 管理的 bean 中创建由@Scheduled注释的方法。 它还需要在任何@Configuration类中使用@EnableScheduling

春季教程

您可以在 @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);
}

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

您可以使用Quartz Scheduler

Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 将任务定义为标准Java组件的作业,这些组件可以执行几乎任何可以编程的程序。 Quartz Scheduler包含许多企业级功能,例如支持JTA事务和集群。

你可能会发现一些博客,说明如何在春季启动中使用石英,包括定义JobDetail,Trigger,工厂等的bean,这些都是压倒性和繁琐的。

有简单的方法来做同样的事情。

您可以尝试https://github.com/mejariamol/quartz-easy 该库简化了spring引导框架中的quartz调度器集成。 我在其中一个项目中设置了石英调度程序时提出了这个问题。

  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,Triggers等。

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

<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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM