![](/img/trans.png)
[英]What is the best way for softcoding schedule tasks in 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-scheduler
并send 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调度器集成。 我在其中一个项目中设置了石英调度程序时提出了这个问题。
import com.indusnode.quartz.annotation.Scheduled;
...
@Scheduled(interval="5", intervalType=Scheduled.IntervalType.SEC)
class TestJob implements Job {
//...
}
qe.base-package
为包含所有作业实现的项目的基本包名称。 另外,在组件扫描中将com.indusnode
作为值添加到basePackage。 要使用此库,请在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.