|
19 | 19 | */
|
20 | 20 | package org.cerberus.core.engine.scheduledtasks;
|
21 | 21 |
|
| 22 | +import java.text.DateFormat; |
| 23 | +import java.text.SimpleDateFormat; |
| 24 | +import java.time.LocalDate; |
| 25 | +import java.time.LocalTime; |
| 26 | +import java.util.Date; |
| 27 | +import java.util.TimeZone; |
| 28 | +import org.cerberus.core.crud.service.IMyVersionService; |
22 | 29 | import org.cerberus.core.crud.service.IParameterService;
|
23 | 30 | import org.cerberus.core.crud.service.ITestCaseExecutionQueueDepService;
|
24 | 31 | import org.cerberus.core.crud.service.ITestCaseExecutionQueueService;
|
@@ -47,98 +54,153 @@ public class ScheduledTaskRunner {
|
47 | 54 | private SchedulerInit schedulerInit;
|
48 | 55 | @Autowired
|
49 | 56 | private ITestCaseExecutionQueueDepService testCaseExecutionQueueDepService;
|
| 57 | + @Autowired |
| 58 | + private IMyVersionService myVersionService; |
50 | 59 |
|
51 | 60 | private int b1TickNumberTarget = 60;
|
52 | 61 | private int b1TickNumber = 1;
|
53 | 62 | private int b2TickNumberTarget = 30;
|
54 | 63 | private int b2TickNumber = 1;
|
55 | 64 | private int b3TickNumberTarget = 1;
|
56 | 65 | private int b3TickNumber = 1;
|
| 66 | + private int b4TickNumberTarget = 1; |
| 67 | + private int b4TickNumber = 1; |
| 68 | + |
| 69 | + private long loadingTimestamp = 0; |
| 70 | + private boolean instanceActive = true; |
| 71 | + |
| 72 | + private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.S"; |
57 | 73 |
|
58 | 74 | private static final org.apache.logging.log4j.Logger LOG = org.apache.logging.log4j.LogManager.getLogger(ScheduledTaskRunner.class);
|
59 | 75 |
|
60 | 76 | @Scheduled(fixedRate = 60000, initialDelay = 30000 /* Every minute */)
|
61 | 77 | public void nextStep() {
|
62 |
| - LOG.debug("Schedule Start. " + b1TickNumber + "/" + b1TickNumberTarget + " - " + b2TickNumber + "/" + b2TickNumberTarget + " - " + b3TickNumber + "/" + b3TickNumberTarget); |
63 | 78 |
|
64 |
| - // We get the new period from parameter and trigger the Queue automatic cancellation job. |
65 |
| - b1TickNumberTarget = parameterService.getParameterIntegerByKey("cerberus_automaticqueuecancellationjob_period", "", 60); |
66 |
| - b2TickNumberTarget = parameterService.getParameterIntegerByKey("cerberus_automaticqueueprocessingjob_period", "", 30); |
67 |
| - |
68 |
| - if (b1TickNumber < b1TickNumberTarget) { |
69 |
| - b1TickNumber++; |
70 |
| - } else { |
71 |
| - b1TickNumber = 1; |
72 |
| - performBatch1_CancelOldQueueEntries(); |
| 79 | + /** |
| 80 | + * Secure only 1 Task trigger on a given cerberus instance. Multiple |
| 81 | + * jobs could be triggered if several instance is running. The first |
| 82 | + * scheduler trigger will define loadingTimestamp and instanceActive |
| 83 | + * based on a lock value defined at database level. Only the 1st update |
| 84 | + * (within 10 second delay) will be considered as active. All others |
| 85 | + * will be disabled. |
| 86 | + */ |
| 87 | + if (loadingTimestamp == 0) { |
| 88 | + Date d = new Date(); |
| 89 | + TimeZone tz = TimeZone.getTimeZone("UTC"); |
| 90 | + DateFormat df = new SimpleDateFormat(DATE_FORMAT); |
| 91 | + df.setTimeZone(tz); |
| 92 | + long newVersion = new java.util.Date().getTime(); |
| 93 | + loadingTimestamp = newVersion; |
| 94 | + LOG.debug("Setting local scheduler Version to : {}", newVersion); |
| 95 | + instanceActive = myVersionService.updateAndLockSchedulerVersion(newVersion); |
73 | 96 | }
|
74 | 97 |
|
75 |
| - if (b2TickNumber < b2TickNumberTarget) { |
76 |
| - b2TickNumber++; |
77 |
| - } else { |
78 |
| - b2TickNumber = 1; |
79 |
| - // We trigger the Queue Processing job. |
80 |
| - performBatch2_ProcessQueue(); |
81 |
| - } |
| 98 | + if (instanceActive) { |
| 99 | + |
| 100 | + LOG.debug("Schedule ({}) Start. " |
| 101 | + + b1TickNumber + "/" + b1TickNumberTarget + " - " |
| 102 | + + b2TickNumber + "/" + b2TickNumberTarget + " - " |
| 103 | + + b3TickNumber + "/" + b3TickNumberTarget + " - " |
| 104 | + + b4TickNumber + "/" + b4TickNumberTarget, |
| 105 | + loadingTimestamp); |
| 106 | + |
| 107 | + // We get the new period of each job from parameter. |
| 108 | + b1TickNumberTarget = parameterService.getParameterIntegerByKey("cerberus_automaticqueuecancellationjob_period", "", 60); |
| 109 | + b2TickNumberTarget = parameterService.getParameterIntegerByKey("cerberus_automaticqueueprocessingjob_period", "", 30); |
| 110 | + b3TickNumberTarget = 1; |
| 111 | + b4TickNumberTarget = 1; |
| 112 | + |
| 113 | + if (b1TickNumber < b1TickNumberTarget) { |
| 114 | + b1TickNumber++; |
| 115 | + } else { |
| 116 | + b1TickNumber = 1; |
| 117 | + performBatch1_CancelOldQueueEntries(); |
| 118 | + } |
| 119 | + |
| 120 | + if (b2TickNumber < b2TickNumberTarget) { |
| 121 | + b2TickNumber++; |
| 122 | + } else { |
| 123 | + b2TickNumber = 1; |
| 124 | + // We trigger the Queue Processing job. |
| 125 | + performBatch2_ProcessQueue(); |
| 126 | + } |
| 127 | + |
| 128 | + if (b3TickNumber < b3TickNumberTarget) { |
| 129 | + b3TickNumber++; |
| 130 | + } else { |
| 131 | + b3TickNumber = 1; |
| 132 | + // We trigger the Scheduler init job. |
| 133 | + performBatch3_SchedulerInit(); |
| 134 | + } |
| 135 | + |
| 136 | + if (b4TickNumber < b4TickNumberTarget) { |
| 137 | + b4TickNumber++; |
| 138 | + } else { |
| 139 | + b4TickNumber = 1; |
| 140 | + // We trigger the Queue dependencies release by timing. |
| 141 | + performBatch4_ProcessTimingBasedQueueDependencies(); |
| 142 | + } |
| 143 | + |
| 144 | + LOG.debug("Schedule ({}) Stop. " |
| 145 | + + b1TickNumber + "/" + b1TickNumberTarget + " - " |
| 146 | + + b2TickNumber + "/" + b2TickNumberTarget + " - " |
| 147 | + + b3TickNumber + "/" + b3TickNumberTarget + " - " |
| 148 | + + b4TickNumber + "/" + b4TickNumberTarget, |
| 149 | + loadingTimestamp); |
82 | 150 |
|
83 |
| - if (b3TickNumber < b3TickNumberTarget) { |
84 |
| - b3TickNumber++; |
85 | 151 | } else {
|
86 |
| - b3TickNumber = 1; |
87 |
| - // We trigger the Scheduler init job. |
88 |
| - performBatch3_SchedulerInit(); |
89 |
| - } |
| 152 | + LOG.debug("Schedule ({}) disabled. ", loadingTimestamp); |
90 | 153 |
|
91 |
| - performBatch3_ProcessTimingBasedQueueDependencies(); |
| 154 | + } |
92 | 155 |
|
93 |
| - LOG.debug("Schedule Stop. " + b1TickNumber + "/" + b1TickNumberTarget + " - " + b2TickNumber + "/" + b2TickNumberTarget + " - " + b3TickNumber + "/" + b3TickNumberTarget); |
94 | 156 | }
|
95 | 157 |
|
96 | 158 | private void performBatch1_CancelOldQueueEntries() {
|
97 |
| - LOG.info("automaticqueuecancellationjob Task triggered."); |
| 159 | + LOG.info("Schedule ({}) : automaticqueuecancellationjob Task triggered.", loadingTimestamp); |
98 | 160 | if (parameterService.getParameterBooleanByKey("cerberus_automaticqueuecancellationjob_active", "", true)) {
|
99 | 161 | testCaseExecutionQueueService.cancelRunningOldQueueEntries();
|
100 | 162 | } else {
|
101 |
| - LOG.info("automaticqueuecancellationjob Task disabled by config (cerberus_automaticqueuecancellationjob_active)."); |
| 163 | + LOG.info("Schedule ({}) : automaticqueuecancellationjob Task disabled by config (cerberus_automaticqueuecancellationjob_active).", loadingTimestamp); |
102 | 164 | }
|
103 |
| - LOG.info("automaticqueuecancellationjob Task ended."); |
| 165 | + LOG.info("Schedule ({}) : automaticqueuecancellationjob Task ended.", loadingTimestamp); |
104 | 166 | }
|
105 | 167 |
|
106 | 168 | private void performBatch2_ProcessQueue() {
|
107 |
| - LOG.info("automaticqueueprocessingjob Task triggered."); |
| 169 | + LOG.info("Schedule ({}) : automaticqueueprocessingjob Task triggered.", loadingTimestamp); |
108 | 170 | if (parameterService.getParameterBooleanByKey("cerberus_automaticqueueprocessingjob_active", "", true)) {
|
109 | 171 | try {
|
110 | 172 | executionThreadPoolService.executeNextInQueue(false);
|
111 | 173 | } catch (CerberusException ex) {
|
112 | 174 | LOG.error(ex.toString(), ex);
|
113 | 175 | }
|
114 | 176 | } else {
|
115 |
| - LOG.info("automaticqueueprocessingjob Task disabled by config (cerberus_automaticqueueprocessingjob_active)."); |
| 177 | + LOG.info("Schedule ({}) : automaticqueueprocessingjob Task disabled by config (cerberus_automaticqueueprocessingjob_active).", loadingTimestamp); |
116 | 178 | }
|
117 |
| - LOG.info("automaticqueueprocessingjob Task ended."); |
| 179 | + LOG.info("Schedule ({}) : automaticqueueprocessingjob Task ended.", loadingTimestamp); |
118 | 180 | }
|
119 | 181 |
|
120 | 182 | private void performBatch3_SchedulerInit() {
|
121 | 183 | try {
|
122 |
| - LOG.debug("SchedulerInit Task triggered."); |
| 184 | + LOG.debug("Schedule ({}) : SchedulerInit Task triggered.", loadingTimestamp); |
123 | 185 | schedulerInit.init();
|
124 |
| - LOG.debug("SchedulerInit Task ended."); |
| 186 | + LOG.debug("Schedule ({}) : SchedulerInit Task ended.", loadingTimestamp); |
125 | 187 | } catch (Exception e) {
|
126 |
| - LOG.error("ScheduleEntry init from scheduletaskrunner failed : " + e); |
| 188 | + LOG.error("ScheduleEntry init from scheduletaskrunner failed : " + e, e); |
127 | 189 | }
|
128 | 190 |
|
129 | 191 | }
|
130 | 192 |
|
131 |
| - private void performBatch3_ProcessTimingBasedQueueDependencies() { |
| 193 | + private void performBatch4_ProcessTimingBasedQueueDependencies() { |
132 | 194 | try {
|
133 |
| - LOG.debug("Queue dep timing Task triggered."); |
| 195 | + LOG.debug("Schedule ({}) : Queue dep timing Task triggered.", loadingTimestamp); |
134 | 196 | int nbReleased = testCaseExecutionQueueDepService.manageDependenciesCheckTimingWaiting();
|
135 | 197 | if (nbReleased > 0) {
|
136 |
| - LOG.info(nbReleased + " Queue entry(ies) has(have) been released due to TIMING dependencies. We trigger now the processing of the queue entry."); |
| 198 | + LOG.info("Schedule ({}) : " + nbReleased + " Queue entry(ies) has(have) been released due to TIMING dependencies. We trigger now the processing of the queue entry.", loadingTimestamp); |
137 | 199 | executionThreadPoolService.executeNextInQueue(false);
|
138 | 200 | }
|
139 |
| - LOG.debug("Queue dep timing Task ended."); |
| 201 | + LOG.debug("Schedule ({}) : Queue dep timing Task ended.", loadingTimestamp); |
140 | 202 | } catch (Exception e) {
|
141 |
| - LOG.error("Queue dep timing Task from scheduletaskrunner failed : " + e); |
| 203 | + LOG.error("Queue dep timing Task from scheduletaskrunner failed : " + e, e); |
142 | 204 | }
|
143 | 205 |
|
144 | 206 | }
|
|
0 commit comments