java - 使用 spring-boot @scheduled 注解同时执行两个调度器
问题描述
我有 2 个调度程序,它们以5 秒的固定延迟执行。
我有 2 个用例:
- 如果如果 - 条件 BusinessLogic类为真,那么我想让两个调度器都休眠3 秒,这意味着两个调度器现在都应该在8 秒 [5 秒 + 3 秒] 后执行。
- 如果代码符合 else 条件,那么两个调度程序都应该以 5 秒的固定延迟继续执行。
代码:
调度程序类:
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class TestSchedulers {
@Autowired
private BusinessLogic businessLogic;
@Scheduled(fixedDelay = 5000)
public void scheduler1(){
Date currentDate = new Date();
System.out.println("Started Sceduler 1 at " + currentDate);
String schedulerName = "Scheduler one";
businessLogic.logic(schedulerName);
}
@Scheduled(fixedDelay = 5000)
public void scheduler2(){
Date currentDate= new Date();
System.out.println("Started Sceduler 2 at " + currentDate);
String schedulerName = "Scheduler two";
businessLogic.logic(schedulerName);
}
}
业务逻辑类:
import java.util.Random;
import org.springframework.stereotype.Service;
@Service
public class BusinessLogic {
public void logic(String schedulerName) {
if(randomGen() < 100){
System.out.println("\nExecuting If condition for [" + schedulerName + "]");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(randomGen() > 100){
System.out.println("\nExecuting Else condition for [" + schedulerName + "]");
}
}
//Generate random numbers
public int randomGen(){
Random rand = new Random();
int randomNum = rand.nextInt((120 - 90) + 1) + 90;
return randomNum;
}
}
问题
- 两个调度程序没有同时启动。
- 当 if 部分正在执行时,只有一个调度程序会额外休眠 3 秒,但我希望两个调度程序都这样做。
日志供参考:
Started Sceduler 1 at Sun May 26 12:34:53 IST 2019
Executing If condition for [Scheduler one]
2019-05-26 12:34:53.266 INFO 9028 --- [ main] project.project.App : Started App in 1.605 seconds (JVM running for 2.356)
Started Sceduler 2 at Sun May 26 12:34:56 IST 2019
Executing If condition for [Scheduler two]
Started Sceduler 1 at Sun May 26 12:35:01 IST 2019
Executing Else condition for [Scheduler one]
Started Sceduler 2 at Sun May 26 12:35:04 IST 2019
Executing Else condition for [Scheduler two]
Started Sceduler 1 at Sun May 26 12:35:06 IST 2019
Executing If condition for [Scheduler one]
Started Sceduler 2 at Sun May 26 12:35:09 IST 2019
Executing Else condition for [Scheduler two]
Started Sceduler 1 at Sun May 26 12:35:14 IST 2019
Executing If condition for [Scheduler one]
Started Sceduler 2 at Sun May 26 12:35:17 IST 2019
Executing If condition for [Scheduler two]
Started Sceduler 1 at Sun May 26 12:35:22 IST 2019
Executing Else condition for [Scheduler one]
Started Sceduler 2 at Sun May 26 12:35:25 IST 2019
Executing Else condition for [Scheduler two]
Started Sceduler 1 at Sun May 26 12:35:27 IST 2019
请帮忙..
解决方案
if(randomGen() < 100)
在每个调度程序中,您彼此独立调用。因此,对于一个调度程序,它可以给出结果 > 100,而对于其他 < 100,或者两者都可能是相同的。您需要做的是randomGen()
在调度程序之外运行并以两个调度程序都可以访问它的方式存储单个结果,然后它们将依赖其if(randomGenValue < 100)
语句中的相同值并以相同的方式运行
推荐阅读
- laravel - 无法发布,因为 predis 处于订阅者模式(Laravel)
- react-native - 在 TouchableHighlight 中嵌套 Button 或 TouchableHighlight
- java - java创建一个返回哈希集的函数
- c++ - RC4 未生成正确的加扰状态数组
- c++ - 如何使用数组查找标准偏差
- javascript - 如何在提交时将输入日期格式从 MM dd yy 更改/转换为 yyyy-mm-dd
- javascript - 三.js改变每个粒子的轴心点
- wpf - 在 Core 3 客户端中找不到 WithUrl()
- scala - 在 Spark scala 中读取简单 JSON 文件时将所有记录设为 NULL
- python - 如何让python只读取文本文件的内容一次