Produced by Araxis Merge on 11/14/2017 6:57:21 AM Central Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\service | SchedulingService.java | Thu Nov 9 14:19:42 2017 UTC |
| 2 | cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\service | SchedulingService.java | Tue Nov 14 12:27:12 2017 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 2 | 1782 |
| Changed | 1 | 2 |
| Inserted | 0 | 0 |
| Removed | 0 | 0 |
| Whitespace | |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | package go v.va.cpss. service; | |
| 2 | ||
| 3 | import sta tic gov.va .cpss.ESAP I.EsapiVal idationTyp e.LOG_FORG ING; | |
| 4 | import sta tic gov.va .cpss.ESAP I.EsapiVal idator.val idateStrin gInput; | |
| 5 | ||
| 6 | import jav a.text.Par seExceptio n; | |
| 7 | import jav a.util.Arr ayList; | |
| 8 | import jav a.util.Cal endar; | |
| 9 | import jav a.util.Dat e; | |
| 10 | import jav a.util.Lis t; | |
| 11 | import jav a.util.Set ; | |
| 12 | ||
| 13 | import org .apache.lo g4j.Logger ; | |
| 14 | import org .quartz.Cr onExpressi on; | |
| 15 | import org .quartz.Cr onTrigger; | |
| 16 | import org .quartz.Jo b; | |
| 17 | import org .quartz.Jo bBuilder; | |
| 18 | import org .quartz.Jo bDataMap; | |
| 19 | import org .quartz.Jo bDetail; | |
| 20 | import org .quartz.Jo bKey; | |
| 21 | import org .quartz.Sc heduler; | |
| 22 | import org .quartz.Sc hedulerExc eption; | |
| 23 | import org .quartz.Si mpleTrigge r; | |
| 24 | import org .quartz.Tr igger; | |
| 25 | import org .quartz.Tr iggerKey; | |
| 26 | import org .quartz.im pl.matcher s.GroupMat cher; | |
| 27 | import org .quartz.im pl.trigger s.CronTrig gerImpl; | |
| 28 | import org .quartz.im pl.trigger s.SimpleTr iggerImpl; | |
| 29 | import org .springfra mework.bat ch.core.la unch.JobLa uncher; | |
| 30 | import org .springfra mework.sch eduling.qu artz.Quart zJobBean; | |
| 31 | import org .springfra mework.ste reotype.Se rvice; | |
| 32 | ||
| 33 | import gov .va.cpss.c ron.CronUt ils; | |
| 34 | import gov .va.cpss.j ob.Interna lJob; | |
| 35 | import gov .va.cpss.m odel.Batch Job; | |
| 36 | import gov .va.cpss.m odel.Batch Type; | |
| 37 | ||
| 38 | /** | |
| 39 | * Service class for schedulin g activiti es relatin g to batch jobs. | |
| 40 | * | |
| 41 | * @author DN S BROWNL | |
| 42 | */ | |
| 43 | @Service | |
| 44 | public cla ss Schedul ingService { | |
| 45 | ||
| 46 | pr ivate stat ic final L ogger logg er = Logge r.getLogge r(Scheduli ngService. class.getC anonicalNa me()); | |
| 47 | ||
| 48 | /* * | |
| 49 | * The job g roup for Q uartz Jobs . | |
| 50 | * / | |
| 51 | pr ivate Stri ng jobGrou p; | |
| 52 | ||
| 53 | /* * | |
| 54 | * The trigg er group f or Quartz Jobs. | |
| 55 | * / | |
| 56 | pr ivate Stri ng trigger Group; | |
| 57 | ||
| 58 | /* * | |
| 59 | * The inter nal job gr oup for Qu artz jobs that are n ot open to the UI. | |
| 60 | * / | |
| 61 | pr ivate List <InternalJ ob> intern alGroup; | |
| 62 | ||
| 63 | /* * | |
| 64 | * The Quart z schedule r. | |
| 65 | * / | |
| 66 | pr ivate Sche duler sche duler; | |
| 67 | ||
| 68 | /* * | |
| 69 | * The servi ce for man aging batc h jobs. | |
| 70 | * / | |
| 71 | pr ivate Batc hService b atchServic e; | |
| 72 | ||
| 73 | /* * | |
| 74 | * Spring Ba tch JobLau ncher for starting F lowJobs | |
| 75 | * / | |
| 76 | pr ivate JobL auncher jo bLauncher; | |
| 77 | ||
| 78 | pu blic Sched ulingServi ce() { | |
| 79 | inte rnalGroup = new Arra yList<Inte rnalJob>() ; | |
| 80 | } | |
| 81 | ||
| 82 | pu blic Strin g getJobGr oup() { | |
| 83 | retu rn jobGrou p; | |
| 84 | } | |
| 85 | ||
| 86 | pu blic void setJobGrou p(String j obGroup) { | |
| 87 | this .jobGroup = jobGroup ; | |
| 88 | } | |
| 89 | ||
| 90 | pu blic Strin g getTrigg erGroup() { | |
| 91 | retu rn trigger Group; | |
| 92 | } | |
| 93 | ||
| 94 | pu blic void setTrigger Group(Stri ng trigger Group) { | |
| 95 | this .triggerGr oup = trig gerGroup; | |
| 96 | } | |
| 97 | ||
| 98 | pu blic List< InternalJo b> getInte rnalGroup( ) { | |
| 99 | retu rn interna lGroup; | |
| 100 | } | |
| 101 | ||
| 102 | pu blic void setInterna lGroup(Lis t<Internal Job> inter nalGroup) { | |
| 103 | this .internalG roup = int ernalGroup ; | |
| 104 | } | |
| 105 | ||
| 106 | pu blic Sched uler getSc heduler() { | |
| 107 | retu rn schedul er; | |
| 108 | } | |
| 109 | ||
| 110 | pu blic void setSchedul er(Schedul er schedul er) { | |
| 111 | this .scheduler = schedul er; | |
| 112 | } | |
| 113 | ||
| 114 | pu blic Batch Service ge tBatchServ ice() { | |
| 115 | retu rn batchSe rvice; | |
| 116 | } | |
| 117 | ||
| 118 | pu blic void setBatchSe rvice(Batc hService b atchServic e) { | |
| 119 | this .batchServ ice = batc hService; | |
| 120 | } | |
| 121 | ||
| 122 | pu blic JobLa uncher get JobLaunche r() { | |
| 123 | retu rn jobLaun cher; | |
| 124 | } | |
| 125 | ||
| 126 | pu blic void setJobLaun cher(JobLa uncher job Launcher) { | |
| 127 | this .jobLaunch er = jobLa uncher; | |
| 128 | } | |
| 129 | ||
| 130 | /* * | |
| 131 | * Build the trigger n ame for th e batch jo b. The nam e is simpl y the batc h | |
| 132 | * job name with Trigg er postfix . | |
| 133 | * | |
| 134 | * @param ba tchJob | |
| 135 | * The batc h job for which to c reate a tr igger name . | |
| 136 | * @return S tring of t he name of the trigg er. | |
| 137 | * / | |
| 138 | pr ivate Stri ng buildTr iggerNameF orJob(Batc hJob batch Job) { | |
| 139 | retu rn batchJo b.getName( ) + "Trigg er"; | |
| 140 | } | |
| 141 | ||
| 142 | /* * | |
| 143 | * Save the specified batch job to the dat abase and update the Quartz | |
| 144 | * Schedule. | |
| 145 | * | |
| 146 | * @param ba tchJob | |
| 147 | * The batc h job to s ave. | |
| 148 | * / | |
| 149 | pu blic void saveBatchJ ob(BatchJo b batchJob ) { | |
| 150 | Batc hType bt = batchServ ice.getBat chTypeForJ ob(batchJo b); | |
| 151 | ||
| 152 | // H andle sche duling bas ed on job type. | |
| 153 | swit ch (bt.get JobType()) { | |
| 154 | case DAILY: { | |
| 155 | logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING) + ": " | |
| 156 | + validate StringInpu t(batchJob .getSchedu le(), LOG_ FORGING) + " " | |
| 157 | + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING)); | |
| 158 | saveBa tchCron(ba tchJob); | |
| 159 | break; | |
| 160 | } | |
| 161 | case MANUAL: { | |
| 162 | logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING) + ": " + "Manual Ru n" + " " | |
| 163 | + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING)); | |
| 164 | batchJ ob.setSche dule(Batch Type.JobTy pe.MANUAL. getName()) ; | |
| 165 | saveBa tchManual( batchJob); | |
| 166 | break; | |
| 167 | } | |
| 168 | case SCHEDULED : { | |
| 169 | logger .info("Sav ing " + va lidateStri ngInput(ba tchJob.get Name(), LO G_FORGING) + ": " + "Scheduled Run" + " " | |
| 170 | + validate StringInpu t(batchJob .getSchedu le(), LOG_ FORGING) + " " | |
| 171 | + validate StringInpu t(Integer. toString(b atchJob.ge tTypeId()) , LOG_FORG ING)); | |
| 172 | ||
| 173 | saveBa tchSchedul ed(batchJo b); | |
| 174 | break; | |
| 175 | } | |
| 176 | case UNDEFINED : { | |
| 177 | logger .error("Un able to ha ndle sched ule for UN DEFINED jo b type: " + bt.getNa me()); | |
| 178 | break; | |
| 179 | } | |
| 180 | defa ult: { | |
| 181 | logger .error("Un able to ha ndle sched ule for un recognized job type: " + bt.ge tName()); | |
| 182 | break; | |
| 183 | } | |
| 184 | } | |
| 185 | ||
| 186 | } | |
| 187 | ||
| 188 | /* * | |
| 189 | * Save the batch job in the dat abase and update the Quartz Sc heduler as a | |
| 190 | * cron trig gered job. | |
| 191 | * | |
| 192 | * @param ba tchJob | |
| 193 | * The batc h job from which to update dat abase and scheduler. | |
| 194 | * / | |
| 195 | pu blic void saveBatchC ron(BatchJ ob batchJo b) { | |
| 196 | ||
| 197 | // S ave in DB! | |
| 198 | batc hService.u pdateBatch Job(batchJ ob); | |
| 199 | ||
| 200 | // S et the sch edule! | |
| 201 | setB atchCron(b atchJob); | |
| 202 | } | |
| 203 | ||
| 204 | /* * | |
| 205 | * Set the s cheduler w ith the up dated batc h cron tri ggered job . | |
| 206 | * | |
| 207 | * @param ba tchJob | |
| 208 | * The batc h job from which to update sch eduler. | |
| 209 | * / | |
| 210 | pu blic void setBatchCr on(BatchJo b batchJob ) { | |
| 211 | ||
| 212 | try { | |
| 213 | JobKey jk = new JobKey(bat chJob.getN ame(), job Group); | |
| 214 | ||
| 215 | @Suppr essWarning s("uncheck ed") | |
| 216 | List<T rigger> tL = (List<T rigger>) s cheduler.g etTriggers OfJob(jk); | |
| 217 | ||
| 218 | // If the trigge r list is empty then create a new cron t rigger for | |
| 219 | // the job. | |
| 220 | if (tL .isEmpty() ) { | |
| 221 | ||
| 222 | if (!sch eduler.che ckExists(j k)) { | |
| 223 | // This is an unreco verable er ror. The j ob key sho uld | |
| 224 | // always exist. | |
| 225 | logger.err or("setBat chCron - j ob key doe s not exis t! - exiti ng"); | |
| 226 | return; | |
| 227 | } | |
| 228 | ||
| 229 | CronTrig gerImpl tr igger = ne w CronTrig gerImpl(); | |
| 230 | ||
| 231 | TriggerK ey tK = ne w TriggerK ey(buildTr iggerNameF orJob(batc hJob), tri ggerGroup) ; | |
| 232 | ||
| 233 | trigger. setKey(tK) ; | |
| 234 | ||
| 235 | try { | |
| 236 | checkJobSc hedule(bat chJob); | |
| 237 | ||
| 238 | CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le())); | |
| 239 | ||
| 240 | trigger.se tCronExpre ssion(cron Exp); | |
| 241 | trigger.se tStartTime (new Date( )); | |
| 242 | ||
| 243 | trigger.se tJobKey(jk ); | |
| 244 | trigger.se tJobName(b atchJob.ge tName()); | |
| 245 | ||
| 246 | logger.inf o(trigger. toString() ); | |
| 247 | ||
| 248 | Date nextF ireDate = scheduler. scheduleJo b(trigger) ; | |
| 249 | ||
| 250 | if (nextFi reDate == null) { | |
| 251 | lo gger.error ("Schedule of job wa s unsucces sful."); | |
| 252 | } | |
| 253 | } catch (ParseExce ption e) { | |
| 254 | logger.err or("Parse error with Cron Expr ession: " + e.getMes sage()); | |
| 255 | } | |
| 256 | ||
| 257 | return; | |
| 258 | } | |
| 259 | ||
| 260 | // The trigger f or the job exists. | |
| 261 | Trigge r t = tL.g et(0); | |
| 262 | ||
| 263 | // Upd ate the tr igger depe nding on t he type. | |
| 264 | if (t instanceof CronTrigg erImpl) { | |
| 265 | ||
| 266 | CronTrig gerImpl tr igger = (C ronTrigger Impl) t; | |
| 267 | TriggerK ey tK = tr igger.getK ey(); | |
| 268 | ||
| 269 | schedule r.pauseTri gger(tK); | |
| 270 | ||
| 271 | try { | |
| 272 | CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le())); | |
| 273 | trigger.se tCronExpre ssion(cron Exp); | |
| 274 | trigger.se tStartTime (new Date( )); | |
| 275 | ||
| 276 | Date srjDa te = sched uler.resch eduleJob(t K, trigger ); | |
| 277 | if (srjDat e == null) { | |
| 278 | lo gger.error ("Problem scheduling job: " + validateSt ringInput( batchJob.g etName(), LOG_FORGIN G)); | |
| 279 | } | |
| 280 | } catch (ParseExce ption e) { | |
| 281 | logger.err or( | |
| 282 | "Par se error w ith Cron E xpression: " + valid ateStringI nput(e.get Message(), LOG_FORGI NG)); | |
| 283 | } | |
| 284 | ||
| 285 | } else if (t ins tanceof Si mpleTrigge rImpl) { | |
| 286 | ||
| 287 | SimpleTr iggerImpl trigger = (SimpleTri ggerImpl) t; | |
| 288 | TriggerK ey tK = tr igger.getK ey(); | |
| 289 | ||
| 290 | schedule r.pauseTri gger(tK); | |
| 291 | ||
| 292 | CronTrig gerImpl ne wTrigger = new CronT riggerImpl (); | |
| 293 | newTrigg er.setKey( tK); | |
| 294 | ||
| 295 | try { | |
| 296 | CronExpres sion cronE xp = new C ronExpress ion(CronUt ils.getCro nExpressio n(batchJob .getSchedu le())); | |
| 297 | ||
| 298 | newTrigger .setCronEx pression(c ronExp); | |
| 299 | newTrigger .setStartT ime(new Da te()); | |
| 300 | ||
| 301 | Date srjDa te = sched uler.resch eduleJob(t K, newTrig ger); | |
| 302 | if (srjDat e == null) { | |
| 303 | lo gger.error ("Problem scheduling job: " + validateSt ringInput( batchJob.g etName(), LOG_FORGIN G)); | |
| 304 | } | |
| 305 | } catch (ParseExce ption e) { | |
| 306 | logger.err or("Parse error with Cron Expr ession: " + e.getMes sage()); | |
| 307 | } | |
| 308 | ||
| 309 | } else { | |
| 310 | logger.e rror("Unkn own trigge r type! - Exiting!") ; | |
| 311 | return; | |
| 312 | } | |
| 313 | ||
| 314 | } ca tch (Sched ulerExcept ion e) { | |
| 315 | logger .error("Ca ught Excep tion: " + e.getMessa ge()); | |
| 316 | } | |
| 317 | ||
| 318 | } | |
| 319 | ||
| 320 | pu blic void setInterna lCron(Inte rnalJob in ternalJob) { | |
| 321 | try { | |
| 322 | JobKey jk = new JobKey(int ernalJob.g etFlowJob( ).getName( ), jobGrou p); | |
| 323 | ||
| 324 | @Suppr essWarning s("uncheck ed") | |
| 325 | List<T rigger> tL = (List<T rigger>) s cheduler.g etTriggers OfJob(jk); | |
| 326 | ||
| 327 | // If the trigge r list is empty then create a new cron t rigger for | |
| 328 | // the job. | |
| 329 | if (tL .isEmpty() ) { | |
| 330 | ||
| 331 | if (!sch eduler.che ckExists(j k)) { | |
| 332 | // This is an unreco verable er ror. The j ob key sho uld | |
| 333 | // always exist. | |
| 334 | logger.err or("setBat chCron - j ob key doe s not exis t! - exiti ng"); | |
| 335 | return; | |
| 336 | } | |
| 337 | ||
| 338 | if (inte rnalJob.ge tTrigger() instanceo f CronTrig ger) { | |
| 339 | ||
| 340 | CronTrigge r oldTrigg er = (Cron Trigger) i nternalJob .getTrigge r(); | |
| 341 | CronTrigge rImpl newT rigger = n ew CronTri ggerImpl() ; | |
| 342 | TriggerKey tK = new TriggerKey (internalJ ob.getFlow Job().getN ame() + "T rigger", t riggerGrou p); | |
| 343 | ||
| 344 | newTrigger .setKey(tK ); | |
| 345 | ||
| 346 | try { | |
| 347 | ||
| 348 | ne wTrigger.s etCronExpr ession(old Trigger.ge tCronExpre ssion()); | |
| 349 | ne wTrigger.s etStartTim e(new Date ()); | |
| 350 | ||
| 351 | ne wTrigger.s etJobKey(j k); | |
| 352 | ne wTrigger.s etJobName( internalJo b.getFlowJ ob().getNa me()); | |
| 353 | ne wTrigger.s etMisfireI nstruction (CronTrigg erImpl.MIS FIRE_INSTR UCTION_IGN ORE_MISFIR E_POLICY); | |
| 354 | ||
| 355 | lo gger.info( newTrigger .toString( )); | |
| 356 | ||
| 357 | Da te nextFir eDate = sc heduler.sc heduleJob( newTrigger ); | |
| 358 | ||
| 359 | if (nextFire Date == nu ll) { | |
| 360 | logg er.error(" Schedule o f job was unsuccessf ul."); | |
| 361 | } | |
| 362 | } catch (P arseExcept ion e) { | |
| 363 | lo gger.error ("Parse er ror with C ron Expres sion: " + e.getMessa ge()); | |
| 364 | } | |
| 365 | } else i f (interna lJob.getTr igger() in stanceof S impleTrigg er) { | |
| 366 | ||
| 367 | SimpleTrig ger oldTri gger = (Si mpleTrigge r) interna lJob.getTr igger(); | |
| 368 | SimpleTrig gerImpl ne wTrigger = new Simpl eTriggerIm pl(); | |
| 369 | TriggerKey tK = new TriggerKey (internalJ ob.getFlow Job().getN ame() + "T rigger", t riggerGrou p); | |
| 370 | ||
| 371 | newTrigger .setKey(tK ); | |
| 372 | ||
| 373 | try { | |
| 374 | ne wTrigger.s etRepeatCo unt(oldTri gger.getRe peatCount( )); | |
| 375 | ne wTrigger.s etRepeatIn terval(old Trigger.ge tRepeatInt erval()); | |
| 376 | ne wTrigger.s etStartTim e(new Date ()); | |
| 377 | ||
| 378 | ne wTrigger.s etJobKey(j k); | |
| 379 | ne wTrigger.s etJobName( internalJo b.getFlowJ ob().getNa me()); | |
| 380 | ne wTrigger.s etMisfireI nstruction (CronTrigg erImpl.MIS FIRE_INSTR UCTION_IGN ORE_MISFIR E_POLICY); | |
| 381 | ||
| 382 | lo gger.info( newTrigger .toString( )); | |
| 383 | ||
| 384 | Da te nextFir eDate = sc heduler.sc heduleJob( newTrigger ); | |
| 385 | ||
| 386 | if (nextFire Date == nu ll) { | |
| 387 | logg er.error(" Schedule o f job was unsuccessf ul."); | |
| 388 | } | |
| 389 | } catch (E xception e ) { | |
| 390 | lo gger.error ("Error wi th buildin g Simple T rigger: " + e.getMes sage()); | |
| 391 | } | |
| 392 | } | |
| 393 | ||
| 394 | return; | |
| 395 | } | |
| 396 | ||
| 397 | // The trigger f or the job exists. | |
| 398 | Trigge r t = tL.g et(0); | |
| 399 | if (!( t instance of CronTri ggerImpl) && !(t ins tanceof Si mpleTrigge rImpl)) { | |
| 400 | logger.e rror("Unkn own trigge r type! - Exiting!") ; | |
| 401 | return; | |
| 402 | } | |
| 403 | // Upd ate to a n ew trigger type if n ecessary. | |
| 404 | if (in ternalJob. getTrigger () instanc eof Simple TriggerImp l) { | |
| 405 | SimpleTr igger newT rigger = ( SimpleTrig ger) inter nalJob.get Trigger(); | |
| 406 | // new t rigger mus t have use property elements s tored as s tring | |
| 407 | // as pe r quartz.p roperties | |
| 408 | newTrigg er.getJobD ataMap().p ut("jobDet ail", newT rigger.get JobDataMap ().get("jo bDetail"). toString() ); | |
| 409 | ||
| 410 | TriggerK ey tK = t. getKey(); | |
| 411 | ||
| 412 | schedule r.pauseTri gger(tK); | |
| 413 | ||
| 414 | try { | |
| 415 | Date srjDa te = sched uler.resch eduleJob(t K, newTrig ger); | |
| 416 | if (srjDat e == null) { | |
| 417 | lo gger.error ("Problem scheduling job: " | |
| 418 | + vali dateString Input(inte rnalJob.ge tFlowJob() .getName() , LOG_FORG ING)); | |
| 419 | } | |
| 420 | } catch (Scheduler Exception e) { | |
| 421 | logger.err or("Schedu ler except ion with j ob: " + e. getMessage ()); | |
| 422 | } | |
| 423 | } else if (inter nalJob.get Trigger() instanceof CronTrigg erImpl) { | |
| 424 | CronTrig ger newTri gger = (Cr onTrigger) internalJ ob.getTrig ger(); | |
| 425 | CronTrig gerImpl tr igger = (C ronTrigger Impl) t; | |
| 426 | TriggerK ey tK = tr igger.getK ey(); | |
| 427 | ||
| 428 | schedule r.pauseTri gger(tK); | |
| 429 | ||
| 430 | try { | |
| 431 | ||
| 432 | trigger.se tCronExpre ssion(newT rigger.get CronExpres sion()); | |
| 433 | trigger.se tStartTime (new Date( )); | |
| 434 | ||
| 435 | Date srjDa te = sched uler.resch eduleJob(t K, trigger ); | |
| 436 | ||
| 437 | if (srjDat e == null) { | |
| 438 | lo gger.error ("Problem scheduling internal job: " | |
| 439 | + vali dateString Input(inte rnalJob.ge tFlowJob() .getName() , LOG_FORG ING)); | |
| 440 | } | |
| 441 | } catch (ParseExce ption e) { | |
| 442 | logger.err or( | |
| 443 | "Par se error w ith Cron E xpression: " + valid ateStringI nput(e.get Message(), LOG_FORGI NG)); | |
| 444 | } | |
| 445 | ||
| 446 | } | |
| 447 | } ca tch (Sched ulerExcept ion e) { | |
| 448 | logger .error("Ca ught Excep tion: " + e.getMessa ge()); | |
| 449 | } | |
| 450 | } | |
| 451 | ||
| 452 | /* * | |
| 453 | * Save the batch job in the dat abase and update the Quartz Sc heduler as a | |
| 454 | * simple tr iggered jo b. | |
| 455 | * | |
| 456 | * @param ba tchJob | |
| 457 | * The batc h job from which to update dat abase and scheduler. | |
| 458 | * / | |
| 459 | pu blic void saveBatchS cheduled(B atchJob ba tchJob) { | |
| 460 | ||
| 461 | // S ave in DB! | |
| 462 | batc hService.u pdateBatch Job(batchJ ob); | |
| 463 | ||
| 464 | // S et the sch edule! | |
| 465 | setB atchSchedu led(batchJ ob); | |
| 466 | } | |
| 467 | ||
| 468 | /* * | |
| 469 | * Set the s cheduler w ith the up dated batc h simple t riggered j ob. | |
| 470 | * | |
| 471 | * @param ba tchJob | |
| 472 | * The batc h job from which to update sch eduler. | |
| 473 | * / | |
| 474 | pu blic void setBatchSc heduled(Ba tchJob bat chJob) { | |
| 475 | try { | |
| 476 | ||
| 477 | JobKey jk = new JobKey(bat chJob.getN ame(), job Group); | |
| 478 | ||
| 479 | @Suppr essWarning s("uncheck ed") | |
| 480 | List<T rigger> tL = (List<T rigger>) s cheduler.g etTriggers OfJob(jk); | |
| 481 | ||
| 482 | // If trigger li st is empt y then we make a new trigger. | |
| 483 | if (tL .isEmpty() ) { | |
| 484 | ||
| 485 | if (!sch eduler.che ckExists(j k)) { | |
| 486 | // This is an unreco verable er ror. The j ob key sho uld | |
| 487 | // always exist. | |
| 488 | logger.err or("setBat chSchedule d - job ke y does not exist! - exiting"); | |
| 489 | return; | |
| 490 | } | |
| 491 | ||
| 492 | SimpleTr iggerImpl trigger = new Simple TriggerImp l(); | |
| 493 | TriggerK ey tK = ne w TriggerK ey(buildTr iggerNameF orJob(batc hJob), tri ggerGroup) ; | |
| 494 | ||
| 495 | checkJob Schedule(b atchJob); | |
| 496 | ||
| 497 | final St ring delim s = ":"; | |
| 498 | String[] tokens = batchJob.g etSchedule ().split(d elims); | |
| 499 | Calendar calStart = Calendar .getInstan ce(); | |
| 500 | calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() ); | |
| 501 | calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0])); | |
| 502 | calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ; | |
| 503 | calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ; | |
| 504 | calStart .set(Calen dar.MILLIS ECOND, 0); | |
| 505 | Date myS tartTime = calStart. getTime(); | |
| 506 | ||
| 507 | Calendar calEnd = Calendar.g etInstance (); | |
| 508 | calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd()); | |
| 509 | calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ])); | |
| 510 | calEnd.s et(Calenda r.MINUTE, Integer.pa rseInt(tok ens[1])); | |
| 511 | calEnd.s et(Calenda r.SECOND, Integer.pa rseInt(tok ens[2])); | |
| 512 | calEnd.s et(Calenda r.MILLISEC OND, 0); | |
| 513 | Date myE ndTime = c alEnd.getT ime(); | |
| 514 | ||
| 515 | trigger. setKey(tK) ; | |
| 516 | trigger. setStartTi me(myStart Time); | |
| 517 | trigger. setEndTime (myEndTime ); | |
| 518 | trigger. setRepeatC ount(0); | |
| 519 | trigger. setJobKey( jk); | |
| 520 | trigger. setJobName (batchJob. getName()) ; | |
| 521 | ||
| 522 | trigger. setMisfire Instructio n( | |
| 523 | Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T); | |
| 524 | ||
| 525 | logger.i nfo(trigge r.toString ()); | |
| 526 | ||
| 527 | Date nex tFireDate = schedule r.schedule Job(trigge r); | |
| 528 | ||
| 529 | if (next FireDate = = null) { | |
| 530 | logger.err or("Proble m scheduli ng job: " + validate StringInpu t(batchJob .getName() , LOG_FORG ING)); | |
| 531 | } | |
| 532 | return; | |
| 533 | } | |
| 534 | ||
| 535 | Trigge r t = tL.g et(0); | |
| 536 | if (t instanceof CronTrigg erImpl) { | |
| 537 | CronTrig gerImpl tr igger = (C ronTrigger Impl) t; | |
| 538 | TriggerK ey tK = tr igger.getK ey(); | |
| 539 | ||
| 540 | schedule r.pauseTri gger(tK); | |
| 541 | ||
| 542 | final St ring delim s = ":"; | |
| 543 | String[] tokens = batchJob.g etSchedule ().split(d elims); | |
| 544 | Calendar calStart = Calendar .getInstan ce(); | |
| 545 | calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() ); | |
| 546 | calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0])); | |
| 547 | calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ; | |
| 548 | calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ; | |
| 549 | calStart .set(Calen dar.MILLIS ECOND, 0); | |
| 550 | ||
| 551 | Date myS tartTime = calStart. getTime(); | |
| 552 | ||
| 553 | Calendar calEnd = Calendar.g etInstance (); | |
| 554 | calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd()); | |
| 555 | calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ])); | |
| 556 | calEnd.s et(Calenda r.MINUTE, Integer.pa rseInt(tok ens[1])); | |
| 557 | calEnd.s et(Calenda r.SECOND, Integer.pa rseInt(tok ens[2])); | |
| 558 | calEnd.s et(Calenda r.MILLISEC OND, 0); | |
| 559 | ||
| 560 | Date myE ndTime = c alEnd.getT ime(); | |
| 561 | ||
| 562 | SimpleTr iggerImpl newTrigger = new Sim pleTrigger Impl(); | |
| 563 | newTrigg er.setKey( tK); | |
| 564 | newTrigg er.setStar tTime(mySt artTime); | |
| 565 | newTrigg er.setEndT ime(myEndT ime); | |
| 566 | newTrigg er.setRepe atCount(0) ; | |
| 567 | newTrigg er.setMisf ireInstruc tion( | |
| 568 | Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T); | |
| 569 | ||
| 570 | Date srj Date = sch eduler.res cheduleJob (tK, newTr igger); | |
| 571 | if (srjD ate == nul l) { | |
| 572 | logger.err or("Proble m scheduli ng job: " + validate StringInpu t(batchJob .getName() , LOG_FORG ING)); | |
| 573 | } | |
| 574 | ||
| 575 | } else if (t ins tanceof Si mpleTrigge rImpl) { | |
| 576 | SimpleTr iggerImpl trigger = (SimpleTri ggerImpl) t; | |
| 577 | TriggerK ey tK = tr igger.getK ey(); | |
| 578 | ||
| 579 | schedule r.pauseTri gger(tK); | |
| 580 | ||
| 581 | final St ring delim s = ":"; | |
| 582 | String[] tokens = batchJob.g etSchedule ().split(d elims); | |
| 583 | ||
| 584 | Calendar calStart = Calendar .getInstan ce(); | |
| 585 | calStart .setTime(b atchJob.ge tBatchConf ig().getRa ngeStart() ); | |
| 586 | calStart .set(Calen dar.HOUR_O F_DAY, Int eger.parse Int(tokens [0])); | |
| 587 | calStart .set(Calen dar.MINUTE , Integer. parseInt(t okens[1])) ; | |
| 588 | calStart .set(Calen dar.SECOND , Integer. parseInt(t okens[2])) ; | |
| 589 | calStart .set(Calen dar.MILLIS ECOND, 0); | |
| 590 | ||
| 591 | Date myS tartTime = calStart. getTime(); | |
| 592 | ||
| 593 | Calendar calEnd = Calendar.g etInstance (); | |
| 594 | calEnd.s etTime(bat chJob.getB atchConfig ().getRang eEnd()); | |
| 595 | calEnd.s et(Calenda r.HOUR_OF_ DAY, Integ er.parseIn t(tokens[0 ])); | |
| 596 | calEnd.s et(Calenda r.MINUTE, Integer.pa rseInt(tok ens[1])); | |
| 597 | calEnd.s et(Calenda r.SECOND, Integer.pa rseInt(tok ens[2])); | |
| 598 | calEnd.s et(Calenda r.MILLISEC OND, 0); | |
| 599 | ||
| 600 | Date myE ndTime = c alEnd.getT ime(); | |
| 601 | ||
| 602 | trigger. setKey(tK) ; | |
| 603 | trigger. setStartTi me(myStart Time); | |
| 604 | trigger. setEndTime (myEndTime ); | |
| 605 | trigger. setRepeatC ount(0); | |
| 606 | ||
| 607 | trigger. setMisfire Instructio n( | |
| 608 | Si mpleTrigge rImpl.MISF IRE_INSTRU CTION_RESC HEDULE_NEX T_WITH_EXI STING_COUN T); | |
| 609 | ||
| 610 | Date srj Date = sch eduler.res cheduleJob (tK, trigg er); | |
| 611 | if (srjD ate == nul l) { | |
| 612 | logger.err or("Proble m scheduli ng job: " + validate StringInpu t(batchJob .getName() , LOG_FORG ING)); | |
| 613 | } | |
| 614 | ||
| 615 | } else { | |
| 616 | logger.e rror("Unkn own trigge r type! - Exiting"); | |
| 617 | return; | |
| 618 | } | |
| 619 | ||
| 620 | } ca tch (Sched ulerExcept ion e) { | |
| 621 | logger .error("Ca ught Excep tion: " + e.getMessa ge()); | |
| 622 | } | |
| 623 | ||
| 624 | } | |
| 625 | ||
| 626 | /* * | |
| 627 | * Save the batch job in the dat abase and update the Quartz Sc heduler to | |
| 628 | * unschedul e the job trigger. | |
| 629 | * | |
| 630 | * @param ba tchJob | |
| 631 | * The batc h job from which to update dat abase and scheduler. | |
| 632 | * / | |
| 633 | pu blic void saveBatchM anual(Batc hJob batch Job) { | |
| 634 | ||
| 635 | // S ave in DB! | |
| 636 | batc hService.u pdateBatch Job(batchJ ob); | |
| 637 | ||
| 638 | // S et the sch edule! | |
| 639 | setB atchManual (batchJob) ; | |
| 640 | } | |
| 641 | ||
| 642 | /* * | |
| 643 | * Update th e schedule r to unsch edule the specified batch job. | |
| 644 | * | |
| 645 | * @param ba tchJob | |
| 646 | * The batc h job from which to update sch eduler. | |
| 647 | * / | |
| 648 | pu blic void setBatchMa nual(Batch Job batchJ ob) { | |
| 649 | ||
| 650 | try { | |
| 651 | JobKey jk = new JobKey(bat chJob.getN ame(), job Group); | |
| 652 | ||
| 653 | @Suppr essWarning s("uncheck ed") | |
| 654 | List<T rigger> tL = (List<T rigger>) s cheduler.g etTriggers OfJob(jk); | |
| 655 | ||
| 656 | if (!t L.isEmpty( )) { | |
| 657 | ||
| 658 | // Turn off trigge r. | |
| 659 | Trigger t = tL.get (0); | |
| 660 | schedule r.unschedu leJob(t.ge tKey()); | |
| 661 | } | |
| 662 | ||
| 663 | } ca tch (Sched ulerExcept ion e) { | |
| 664 | logger .error("Ca ught Excep tion: " + e.getMessa ge()); | |
| 665 | } | |
| 666 | } | |
| 667 | ||
| 668 | /* * | |
| 669 | * Check the job sched ule and sa ve a defau lt value i f invalid. | |
| 670 | * | |
| 671 | * @param ba tchJob | |
| 672 | * The batc h job to c heck. | |
| 673 | * / | |
| 674 | pr ivate void checkJobS chedule(Ba tchJob bat chJob) { | |
| 675 | Stri ng schedul e = batchJ ob.getSche dule(); | |
| 676 | if ( (schedule == null) | | schedule .isEmpty() ) { | |
| 677 | schedu le = "23:0 0:00"; | |
| 678 | batchJ ob.setSche dule(sched ule); | |
| 679 | logger .warn("Job '" + batc hJob.getNa me() + "' schedule w as invalid so using default va lue: " + s chedule); | |
| 680 | batchS ervice.upd ateBatchJo b(batchJob ); | |
| 681 | } | |
| 682 | } | |
| 683 | ||
| 684 | /* * | |
| 685 | * Forcefull y run the specified batch job by it's ID . | |
| 686 | * | |
| 687 | * @param id | |
| 688 | * The ID o f the batc h job to r un. | |
| 689 | * / | |
| 690 | pu blic void runJob(int id) { | |
| 691 | ||
| 692 | // L ook up job based on id! | |
| 693 | Batc hJob batch Job = batc hService.g etBatchJob ById(id); | |
| 694 | ||
| 695 | if ( batchJob = = null) { | |
| 696 | logger .error("Ba tch job " + id + " d oes not ex ist."); | |
| 697 | } el se { | |
| 698 | ||
| 699 | // For cefully ru n the job specified by the id. | |
| 700 | JobKey jk = new JobKey(bat chJob.getN ame(), job Group); | |
| 701 | ||
| 702 | try { | |
| 703 | if (sche duler.chec kExists(jk )) { | |
| 704 | scheduler. triggerJob (jk); | |
| 705 | } else { | |
| 706 | logger.err or("Job ke y does not exist."); | |
| 707 | } | |
| 708 | } catc h (Schedul erExceptio n e) { | |
| 709 | logger.e rror("runJ ob excepti on: " + e. getMessage ()); | |
| 710 | } | |
| 711 | } | |
| 712 | } | |
| 713 | ||
| 714 | /* * | |
| 715 | * Initializ e the Quar tz Schedul er upon de ployment. | |
| 716 | * / | |
| 717 | pu blic void initNotifi cationSche duler() { | |
| 718 | ||
| 719 | // C reate jobs from the database. | |
| 720 | List <BatchJob> bjL = bat chService. getBatchJo bList(); | |
| 721 | ||
| 722 | // S ave a list of the jo b names to check if any old jo bs should be | |
| 723 | // r emoved. | |
| 724 | List <String> n ameL = new ArrayList <>(); | |
| 725 | ||
| 726 | for (BatchJob bj : bjL) { | |
| 727 | try { | |
| 728 | ||
| 729 | // Reset status fo r job to n ot running if was fo und to hav e | |
| 730 | // runni ng state. | |
| 731 | // This would indi cate the j ob was une xpected in terrupted or | |
| 732 | // ended in an ear lier run. | |
| 733 | if (batc hService.s etNotRunni ngById(bj) ) { | |
| 734 | logger.war n("Last st atus for b atch job ( " + valida teStringIn put(bj.get Name(), LO G_FORGING) | |
| 735 | + ") set to no t running" ); | |
| 736 | } | |
| 737 | ||
| 738 | Class<?> clazz = C lass.forNa me("gov.va .cpss.job. " + bj.get Name()); | |
| 739 | ||
| 740 | if (claz z.newInsta nce() inst anceof Qua rtzJobBean ) { | |
| 741 | ||
| 742 | JobDataMap map = new JobDataMa p(); | |
| 743 | map.put("n ame", bj.g etName()); | |
| 744 | ||
| 745 | @SuppressW arnings("u nchecked") | |
| 746 | JobDetail job = JobB uilder.new Job((Class <? extends Job>) cla zz).withId entity(bj. getName(), jobGroup) | |
| 747 | .usi ngJobData( map).store Durably(). build(); | |
| 748 | initialize Trigger(bj , job); | |
| 749 | ||
| 750 | nameL.add( bj.getName ()); | |
| 751 | ||
| 752 | } else { | |
| 753 | logger.err or("Invali d Job Clas s: " + val idateStrin gInput(bj. getName(), LOG_FORGI NG)); | |
| 754 | } | |
| 755 | ||
| 756 | } catc h (ClassNo tFoundExce ption e) { | |
| 757 | logger.e rror("Clas sNotFoundE xception w hen initia lizing job : " | |
| 758 | + validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e()); | |
| 759 | } catc h (Instant iationExce ption e) { | |
| 760 | logger.e rror("Inst antiationE xception w hen initia lizing job : " | |
| 761 | + validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e()); | |
| 762 | } catc h (Illegal AccessExce ption e) { | |
| 763 | logger.e rror("Ille galAccessE xception w hen initia lizing job : " | |
| 764 | + validateSt ringInput( bj.getName (), LOG_FO RGING) + " , e: " + e .getMessag e()); | |
| 765 | } | |
| 766 | ||
| 767 | } | |
| 768 | ||
| 769 | for (InternalJ ob interna lJob : int ernalGroup ) { | |
| 770 | Class< ?> clazz = internalJ ob.getJobD etail().ge tJobClass( ); | |
| 771 | ||
| 772 | JobDat aMap map = new JobDa taMap(); | |
| 773 | map.pu t("name", internalJo b.getFlowJ ob().getNa me()); | |
| 774 | ||
| 775 | @Suppr essWarning s("uncheck ed") | |
| 776 | JobDet ail job = JobBuilder .newJob((C lass<? ext ends Job>) clazz) | |
| 777 | .withIdent ity(intern alJob.getF lowJob().g etName(), jobGroup). usingJobDa ta(map).st oreDurably () | |
| 778 | .build(); | |
| 779 | // Run the set b atch cron with some specific t hing that does not | |
| 780 | // nee d BatchJob | |
| 781 | if (cr eateJob(jo b)) { | |
| 782 | setInter nalCron(in ternalJob) ; | |
| 783 | } | |
| 784 | nameL. add(intern alJob.getF lowJob().g etName()); | |
| 785 | } | |
| 786 | ||
| 787 | if ( !deleteNon existantJo bs(nameL)) { | |
| 788 | logger .warn("Pro blem delet ing nonexi stant jobs "); | |
| 789 | } | |
| 790 | } | |
| 791 | ||
| 792 | /* * | |
| 793 | * Initializ e Quartz J ob Trigger s for the specified batch job and job | |
| 794 | * details. | |
| 795 | * | |
| 796 | * @param bj | |
| 797 | * The batc h job for which to u pdate the scheduler. | |
| 798 | * @param jo b | |
| 799 | * The Quar tz job det ails for t he batch j ob. | |
| 800 | * / | |
| 801 | pr ivate void initializ eTrigger(B atchJob bj , JobDetai l job) { | |
| 802 | ||
| 803 | logg er.info("I nitializin g trigger for job: " + job.get Key().getN ame()); | |
| 804 | ||
| 805 | // H andle trig ger initia lization b ased on ty pe. | |
| 806 | swit ch (bj.get BatchType( ).getJobTy pe()) { | |
| 807 | case DAILY: { | |
| 808 | logger .info("DAI LY"); | |
| 809 | if (cr eateJob(jo b)) { | |
| 810 | setBatch Cron(bj); | |
| 811 | } | |
| 812 | break; | |
| 813 | } | |
| 814 | case MANUAL: { | |
| 815 | logger .info("MAN UAL"); | |
| 816 | if (cr eateJob(jo b)) { | |
| 817 | setBatch Manual(bj) ; | |
| 818 | } | |
| 819 | break; | |
| 820 | } | |
| 821 | case SCHEDULED : { | |
| 822 | logger .info("SCH EDULED"); | |
| 823 | if (cr eateJob(jo b)) { | |
| 824 | setBatch Scheduled( bj); | |
| 825 | } | |
| 826 | break; | |
| 827 | } | |
| 828 | case UNDEFINED : { | |
| 829 | logger .error("Un able to in itialize t rigger for UNDEFINED job type: " | |
| 830 | + validate StringInpu t(bj.getBa tchType(). getName(), LOG_FORGI NG)); | |
| 831 | break; | |
| 832 | } | |
| 833 | defa ult: { | |
| 834 | logger .error("Un able to in itialize t rigger for unrecogni zed job ty pe: " | |
| 835 | + validate StringInpu t(bj.getBa tchType(). getName(), LOG_FORGI NG)); | |
| 836 | break; | |
| 837 | } | |
| 838 | } | |
| 839 | ||
| 840 | } | |
| 841 | ||
| 842 | /* * | |
| 843 | * Create th e Quartz J ob in the scheduler if it does not alrea dy exist. | |
| 844 | * | |
| 845 | * @param jo b | |
| 846 | * The job to create. | |
| 847 | * @return B oolean fla g that ind icates if successful ly created job or if the | |
| 848 | * j ob already exists. | |
| 849 | * / | |
| 850 | pr ivate bool ean create Job(JobDet ail job) { | |
| 851 | bool ean succes s = false; | |
| 852 | try { | |
| 853 | if (!s cheduler.c heckExists (job.getKe y())) { | |
| 854 | schedule r.addJob(j ob, false) ; | |
| 855 | logger.i nfo("Job a dded to sc heduler: " + job.get Key().getN ame()); | |
| 856 | } else { | |
| 857 | logger.i nfo("Job e xists in s cheduler: " + job.ge tKey().get Name()); | |
| 858 | } | |
| 859 | succes s = true; | |
| 860 | } ca tch (Sched ulerExcept ion e) { | |
| 861 | logger .error("Un able to ad d job to s cheduler: " + job.ge tKey().get Name() + " , e: " + e .getMessag e()); | |
| 862 | } | |
| 863 | retu rn success ; | |
| 864 | } | |
| 865 | ||
| 866 | /* * | |
| 867 | * Delete an y jobs for the group that is n ot in the cpss batch job table . | |
| 868 | * | |
| 869 | * @param na meL | |
| 870 | * The list of batch jobs in th e cpss bat ch job tab le. | |
| 871 | * / | |
| 872 | pr ivate bool ean delete Nonexistan tJobs(fina l List<Str ing> nameL ) { | |
| 873 | bool ean result = false; | |
| 874 | Grou pMatcher<J obKey> mat cher = Gro upMatcher. groupEqual s(jobGroup ); | |
| 875 | try { | |
| 876 | Set<Jo bKey> jobK eyS = sche duler.getJ obKeys(mat cher); | |
| 877 | for (J obKey jobK ey : jobKe yS) { | |
| 878 | // If jo b not foun d then del ete it. | |
| 879 | if (!nam eL.contain s(jobKey.g etName())) { | |
| 880 | logger.inf o("Deletin g old sche duled job that was n ot in the batch job database t able: " | |
| 881 | + jo bKey.getNa me()); | |
| 882 | scheduler. deleteJob( jobKey); | |
| 883 | } | |
| 884 | } | |
| 885 | result = true; | |
| 886 | } ca tch (Sched ulerExcept ion e) { | |
| 887 | logger .error("Er ror deleti ng nonexis tant jobs: " + e.get Message()) ; | |
| 888 | } | |
| 889 | retu rn result; | |
| 890 | } | |
| 891 | ||
| 892 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993-2016 Araxis Ltd (www.araxis.com). All rights reserved.