我目前正在开发基于Spring-Boot的应用程序。
我知道像@Scheduled这样的注释可以安排任务。由于我的应用程序中的用户想要在不同的时间发送邮件并且只发送一次。
我已阅读帖子Spring scheduling task - run only once, 但在基于Spring的应用程序中,总是“新”的本地执行器很奇怪。
通过这种方式,一旦用户安排发送电子邮件,我就必须为他的任务“新”一名localExecutor。
那么,还有更好的方法吗?
答案 0 :(得分:22)
在Spring中安排任务的最简单方法是在Spring托管bean中创建由@Scheduled
注释的方法。在任何@EnableScheduling
类中也需要@Configuration
。
答案 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-scheduler
和send 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集成。我在工作中的一个项目中设置石英调度程序时想到了这一点。
import com.indusnode.quartz.annotation.Scheduled;
...
@Scheduled(interval="5", intervalType=Scheduled.IntervalType.SEC)
class TestJob implements Job {
//...
}
qe.base-package
设置为项目的基本软件包名称,该项目将包含您的所有作业实现。另外,在组件扫描中,将com.indusnode
作为值添加到basePackage。要使用此库,请在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来避免此问题。使用任务可以解决此问题。