JobScheduler.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.its.traf.scheduler;
  2. import com.its.traf.config.SchedulerConfig;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.scheduling.TaskScheduler;
  7. import org.springframework.scheduling.annotation.SchedulingConfigurer;
  8. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  9. import org.springframework.scheduling.config.ScheduledTaskRegistrar;
  10. import org.springframework.scheduling.support.CronTrigger;
  11. import org.springframework.stereotype.Service;
  12. import javax.annotation.PostConstruct;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.Random;
  17. import java.util.concurrent.ScheduledFuture;
  18. @Slf4j
  19. @Configuration
  20. @Service
  21. public class JobScheduler implements SchedulingConfigurer {
  22. private final SchedulerConfig schedulerConfig;
  23. private ScheduledTaskRegistrar scheduledTaskRegistrar;
  24. private Map<String, ScheduledFuture> futureMap = new HashMap<>();
  25. private Map<String, JobScheduleInfo> batchScheduleMap = new HashMap<>();
  26. public JobScheduler(SchedulerConfig schedulerConfig) {
  27. this.schedulerConfig = schedulerConfig;
  28. }
  29. @PostConstruct
  30. public void init() {
  31. /*List<JobScheduleInfo> jobs = this.jobSchedulerConfig.getJobs();
  32. for(JobScheduleInfo info : jobs) {
  33. addJob(info);
  34. this.scheduleMap.put(info.getName(), info);
  35. }*/
  36. }
  37. @Bean
  38. public TaskScheduler poolScheduler() {
  39. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
  40. scheduler.setThreadNamePrefix("jobScheduler-");
  41. scheduler.setPoolSize(this.schedulerConfig.getPoolCore());
  42. scheduler.initialize();
  43. return scheduler;
  44. }
  45. @Override
  46. public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  47. /*if (this.scheduledTaskRegistrar == null) {
  48. this.scheduledTaskRegistrar = taskRegistrar;
  49. }
  50. if (taskRegistrar.getScheduler() == null) {
  51. taskRegistrar.setScheduler(poolScheduler());
  52. }*/
  53. taskRegistrar.setScheduler(poolScheduler());
  54. List<JobScheduleInfo> jobs = this.schedulerConfig.getBatchJobs();
  55. for(JobScheduleInfo info : jobs) {
  56. this.batchScheduleMap.put(info.getName(), info);
  57. taskRegistrar.addTriggerTask(() -> batchJobScheduleCron(info.getName()), t -> {
  58. CronTrigger crontrigger = new CronTrigger(info.getCron());
  59. return crontrigger.nextExecutionTime(t);
  60. });
  61. }
  62. /*
  63. taskRegistrar.setScheduler(poolScheduler());
  64. // Random next execution time.
  65. taskRegistrar.addTriggerTask(() -> scheduleDynamically(), t -> {
  66. Calendar nextExecutionTime = new GregorianCalendar();
  67. Date lastActualExecutionTime = t.lastActualExecutionTime();
  68. nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
  69. nextExecutionTime.add(Calendar.SECOND, getNextExecutionTime()); // This is where we set the next execution time.
  70. return nextExecutionTime.getTime();
  71. });
  72. // Fixed next execution time.
  73. taskRegistrar.addTriggerTask(() -> scheduleFixed(), t -> {
  74. Calendar nextExecutionTime = new GregorianCalendar();
  75. Date lastActualExecutionTime = t.lastActualExecutionTime();
  76. nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
  77. nextExecutionTime.add(Calendar.SECOND, 7); // This is where we set the next execution time.
  78. return nextExecutionTime.getTime();
  79. });
  80. // Next execution time is taken from DB, so if the value in DB changes, next execution time will change too.
  81. taskRegistrar.addTriggerTask(() -> scheduledDatabase(repo.findById("next_exec_time").get().getConfigValue()), t -> {
  82. Calendar nextExecutionTime = new GregorianCalendar();
  83. Date lastActualExecutionTime = t.lastActualExecutionTime();
  84. nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
  85. nextExecutionTime.add(Calendar.SECOND, Integer.parseInt(repo.findById("next_exec_time").get().getConfigValue()));
  86. return nextExecutionTime.getTime();
  87. });
  88. // or cron way, you can also get the expression from DB or somewhere else just like we did above.
  89. taskRegistrar.addTriggerTask(() -> scheduleCron(repo.findById("next_exec_time").get().getConfigValue()), t -> {
  90. CronTrigger crontrigger = new CronTrigger(repo.findById("next_exec_time").get().getConfigValue());
  91. return crontrigger.nextExecutionTime(t);
  92. });*/
  93. }
  94. public boolean addJob(JobScheduleInfo jobInfo) {
  95. if (this.futureMap.containsKey(jobInfo.getName())) {
  96. return false;
  97. }
  98. /* this.scheduledTaskRegistrar.getScheduler().addTriggerTask(() -> scheduleCron(repo.findById("next_exec_time").get().getConfigValue()), t -> {
  99. CronTrigger crontrigger = new CronTrigger(repo.findById("next_exec_time").get().getConfigValue());
  100. return crontrigger.nextExecutionTime(t);
  101. });
  102. ScheduledFuture future = this.scheduledTaskRegistrar.getScheduler().schedule(() -> methodToBeExecuted(), t -> {
  103. Calendar nextExecutionTime = new GregorianCalendar();
  104. Date lastActualExecutionTime = t.lastActualExecutionTime();
  105. nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
  106. nextExecutionTime.add(Calendar.SECOND, 5);
  107. return nextExecutionTime.getTime();
  108. });*/
  109. configureTasks(this.scheduledTaskRegistrar);
  110. //this.futureMap.put(jobInfo.getName(), future);
  111. return true;
  112. }
  113. public boolean removeJob(String name) {
  114. if (!this.futureMap.containsKey(name)) {
  115. return false;
  116. }
  117. ScheduledFuture future = this.futureMap.get(name);
  118. future.cancel(true);
  119. this.futureMap.remove(name);
  120. return true;
  121. }
  122. public void scheduleDynamically() {
  123. log.info("scheduleDynamically: Next execution time of this changes every time between 1 and 5 seconds");
  124. }
  125. public void scheduleFixed() {
  126. log.info("scheduleFixed: Next execution time of this will always be 7 seconds");
  127. }
  128. public void scheduledDatabase(String time) {
  129. log.info("scheduledDatabase: Next execution time of this will be taken from DB -> {}", time);
  130. }
  131. public void batchJobScheduleCron(String jobName) {
  132. JobScheduleInfo job = this.batchScheduleMap.get(jobName);
  133. if (job != null) {
  134. log.info("scheduleCron: Next execution time of this taken from cron expression -> {}", job.toString());
  135. }
  136. }
  137. public int getNextExecutionTime() {
  138. return new Random().nextInt(5) + 1;
  139. }
  140. }