package Ġio . ple o . ant ae us . schedule . job čĊč Ċ import Ġio . ple o . ant ae us . core . exceptions . Network Exception č Ċ import Ġio . ple o . ant ae us . core . services . Billing Service č Ċ import Ġio . ple o . ant ae us . schedule . service . Job Scheduling Service č Ċ import Ġmu . Kotlin Logging č Ċ import Ġorg . quartz . Job č Ċ import Ġorg . quartz . Job ExecutionContext č Ċ import Ġorg . quartz . Job ExecutionException č Ċ import Ġjava . time . LocalDateTime č Ċ import Ġjava . util . concurrent . Future Task čĊč Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger {} čĊč Ċ internal Ġclass ĠSubscription Job () Ġ: ĠJob Ġ{ čĊĠĠĠ Ġprivate Ġvar Ġretries Ġ= Ġ 0 čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe Ġ`[ Scheduler ]` Ġwhen Ġa Ġ`[ Trigger ]` čĊĠĠĠĠ Ġ* Ġfires Ġthat Ġis Ġassociated Ġwith Ġthe Ġ` Job `. čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* ĠThe Ġimplementation Ġmay Ġwish Ġto Ġset Ġa čĊĠĠĠĠ Ġ* Ġ[ result ][ Job ExecutionContext . set Result ] Ġobject Ġon Ġthe čĊĠĠĠĠ Ġ* Ġ[ Job ExecutionContext ] Ġbefore Ġthis Ġmethod Ġexits . Ġ ĠThe Ġresult Ġitself čĊĠĠĠĠ Ġ* Ġis Ġmeaning less Ġto ĠQu artz , Ġbut Ġmay Ġbe Ġinform ative Ġto čĊĠĠĠĠ Ġ* Ġ`[ Job Listener ] s ` Ġor čĊĠĠĠĠ Ġ* Ġ`[ Trigger Listener ] s ` Ġthat Ġare Ġwatching Ġthe Ġjob 's čĊĠĠĠĠ Ġ* Ġexecution . čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġcontext čĊĠĠĠĠ Ġ* Ġ@ throws ĠJob ExecutionException Ġif Ġthere Ġis Ġan Ġexception Ġwhile Ġexecuting Ġthe Ġjob . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġ@ Throws ( Job ExecutionException :: class ) čĊĠĠĠ Ġoverride Ġfun Ġexecute ( context : ĠJob ExecutionContext ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ// Process Ġmy ĠTask Ġhere čĊĠĠĠĠĠĠĠ Ġperform AsyncTask ( context ); čĊčĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun Ġperform AsyncTask ( job ExecutionContext : ĠJob ExecutionContext ){ čĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Subscription ĠProcess ĠStarted " Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġjob ExecutionContext . scheduler . context čĊĠĠĠĠĠĠĠ Ġvar Ġbilling Service Ġ= Ġcontext [ Job Scheduling Service . B ILL ING _ SERVICE ] Ġas ĠBilling Service čĊĠĠĠĠĠĠĠ Ġval Ġfuture Task Ġ= ĠFuture Task { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Service . process Subscription (); čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġfuture Task . run (); čĊčĊĠĠĠĠĠĠĠ Ġ// Task Ġget ĠCompleted čĊĠĠĠĠĠĠĠ Ġif ( future Task . is Done ){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Job Ġis Ġcompleted Ġat Ġ"+ LocalDateTime . now () Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Checks Ġif Ġthere Ġare Ġfailed Ġin voices Ġin Ġthe Ġresults . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Failed Invoice By Processing Status ( billing Service ); čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Schedules Ġdate Ġfor Ġthe Ġnext Ġmonth čĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Next Job ( billing Service ); čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// Task ĠWas ĠCancel led čĊĠĠĠĠĠĠĠ Ġif Ġ( future Task . is Cancelled ){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġretries ++; čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Process Ġwas Ġcancelled . ĠRetry ing Ġagain ..." Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Here ĠI Ġhave Ġset Ġthe Ġnumber Ġof Ġretries Ġto Ġ 5 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// send Ġa Ġnotification čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( retries Ġ== Ġ 5 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Send Ġa Ġreport čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Exceeded Ġmaximum Ġnumber Ġof Ġretries " Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Retry ĠTask čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform AsyncTask ( job ExecutionContext ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe Ġ`[ Job Schedule . execute ]` čĊĠĠĠĠ Ġ* Ġafter Ġa Ġsuccessful Ġjob Ġexecution Ġto Ġre schedule Ġfirst Ġdate Ġfor Ġthe Ġnext Ġmonth čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġschedule Next Job ( billing Service : ĠBilling Service ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġjob Service Ġ= ĠJob Scheduling Service ( billing Service ) čĊĠĠĠĠĠĠĠ Ġjob Service . schedule ( job Service . next Date ()) čĊĠĠĠĠĠĠĠ Ġlogger . info (" Job ĠScheduled Ġfor Ġthe Ġnext Ġmonth ") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠMethod Ġis Ġcalled Ġto Ġcross Ġcheck Ġif Ġall Ġin voices Ġhave Ġbeen Ġchar ged Ġwith čĊĠĠĠĠ Ġ* Ġsubscriptions . ĠIf Ġ Ġ[ Network Exception ] Ġwas Ġthrown , Ġmethod Ġwill Ġinvoke Ġ`[ Billing Service . retry Invoice Subscription Operation ]` čĊĠĠĠĠ Ġ* Ġto Ġcharge Ġsubscription Ġon Ġthe Ġfailed ĠIn voices . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġcheck Failed Invoice By Processing Status ( billing Service : Billing Service ){ čĊĠĠĠĠĠĠĠ Ġif (! billing Service . failed Invoice List . isEmpty ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Service . retry Invoice Subscription Operation (); čĊĠĠĠ Ġ} č Ċ } čĊ