package Ġio . ple o . ant ae us . core . jobs Ċ Ċ import Ġio . ple o . ant ae us . core . exceptions . Currency Mismatch Exception Ċ import Ġio . ple o . ant ae us . core . exceptions . Customer NotFoundException Ċ import Ġio . ple o . ant ae us . core . exceptions . Invoice NotFoundException Ċ 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 . services . Scheduling Service Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . quartz . Job Ċ import Ġorg . quartz . Job ExecutionContext Ċ import Ġorg . quartz . Job ExecutionException Ċ import Ġorg . quartz . Scheduler Exception Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ /** Ċ Ġ* ĠActual Ġbilling Ġis Ġhandled Ġwith Ġthis Ġjob Ċ Ġ*/ Ċ internal Ġclass ĠBilling Job Ġ: ĠJob Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ{@ inheritDoc } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( job ExecutionContext : ĠJob ExecutionContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvoice Id Ġ= Ġjob ExecutionContext . merged Job DataMap . getInt Value (" invoice Id ") ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġjob ExecutionContext . scheduler . context ĊĠĠĠĠĠĠĠ Ġval Ġbilling Service Ġ= Ġcontext [ Scheduling Service . B ILL ING _ SERVICE ] Ġas ĠBilling Service ĊĊĠĠĠĠĠĠĠ Ġlogger . debug (" Job Ġfor Ġinvoice Ġ{} Ġstarted ", Ġinvoice Id ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvoice Ġ= Ġbilling Service . fetch Invoice ( invoice Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Service . charge Invoice ( invoice ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠCustomer NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" customer Ġ${ ex . id } Ġnot Ġfound ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCustomer Ġnot Ġfound , Ġnotify Ġadmin Ġfor Ġfurther Ġaction Ġor Ġdelete Ġcustomer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBusiness Ġdecision Ġwill Ġdict ate Ġwhat Ġto Ġdo Ġactually ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠCurrency Mismatch Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" currency Ġin Ġinvoice Ġ${ ex . invoice Id } Ġdoes Ġnot Ġmatch Ġcurrency Ġfor Ġcustomer Ġ${ ex . customer Id }", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrency Ġmismatch , Ġcall Ġan Ġexternal Ġservice Ġfor Ġcurrency Ġconversion Ġor Ġnotify Ġsales Ġteam Ġfor Ġfurther Ġaction ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNetwork Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Network Ġerror , Ġretry ing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretry : ĠInt Ġ= Ġjob ExecutionContext . merged Job DataMap [" retries "] Ġas ? ĠInt Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Network Error ( job ExecutionContext , Ġretry ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠInvoice NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" No Ġinvoice Ġmatching Ġinvoice Ġwith Ġid Ġ$ invoice Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInvoice Ġdoes Ġnot Ġexist . ĠPush Ġthis Ġto Ġan Ġoffline Ġprocessing Ġsystem Ġsuch Ġas ĠHadoop Ġfor Ġfurther Ġprocessing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHow Ġdid Ġan Ġinvalid Ġinvoice Ġend Ġup Ġin Ġour Ġsystem ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIn Ġa Ġreal Ġapplication , Ġyou 'd Ġimplement Ġthe Ġretry Ġwith Ġexponential Ġbackoff Ġso Ġnot Ġto Ġover w helm ĊĠĠĠ Ġ// Ġexternal Ġsystem Ġand Ġallow Ġtime Ġto Ġrecover ĊĠĠĠ Ġprivate Ġfun Ġhandle Network Error ( job ExecutionContext : ĠJob ExecutionContext , Ġretry : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġretry For Availability : ĠInt Ġ= Ġretry ĊĠĠĠĠĠĠĠ Ġval Ġmax Retries : ĠInt Ġ= ĠSystem . getenv (" MAX _ RE TR IES ") ?. toInt () Ġ?: Ġ 3 ĊĠĠĠĠĠĠĠ Ġif Ġ( retry Ġ< Ġmax Retries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry For Availability ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob ExecutionContext . merged Job DataMap [" retries "] Ġ= Ġretry For Availability ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( job ExecutionContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠNotify Ġadmin Ġto Ġcheck Ġthe ĊĠĠĠĠĠĠĠ Ġthrow ĠJob ExecutionException (). apply Ġ{ Ġset Un schedule All Triggers ( true ) Ġ} ĊĠĠĠ Ġ} Ċ }