Выполнить два планировщика одновременно с аннотацией spring-boot @scheduled - PullRequest
0 голосов
/ 26 мая 2019

У меня есть 2 планировщика, которые выполняются с fixedDelay из 5 с.


У меня есть 2 варианта использования:

  1. Если Если - условие BusinessLogic класс true, тогда я хочу sleep оба планировщика в течение времени 3 секунд Это означает, что оба планировщика должны выполняться сейчас через 8 секунд [5 секунд + 3 секунды].
  2. Если код удовлетворяет условию 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



пожалуйста, помогите ..

1 Ответ

0 голосов
/ 26 мая 2019

В каждом планировщике вы вызываете if(randomGen() < 100) независимо друг от друга. Таким образом, для одного планировщика он может дать результат> 100, а для другого <100 или для обоих он может быть одинаковым. Вам нужно будет запустить <code>randomGen() вне планировщиков и сохранить один результат так, чтобы оба планировщика могли получить к нему доступ, а затем они будут полагаться на одно и то же значение в своем выражении if(randomGenValue < 100) и будут вести себя одинаково способ

...