package Ġt ed . scheduler . impl Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġt ed . scheduler . impl . Jdbc Select T ed . Jet Jdbc Param Type . LONG Ċ import Ġt ed . scheduler . impl . Jdbc Select T ed . Jet Jdbc Param Type . STRING Ċ import Ġt ed . scheduler . impl . Jdbc Select T ed . Sql Param Ċ import Ġt ed . scheduler . impl . T ed Scheduler Impl . Context Ċ import Ġjava . sql . Connection Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAugust us Ċ Ġ* Ġcreated Ġon Ġ 2 0 1 8 . 0 8 . 1 6 Ċ Ġ* Ċ Ġ* Ġfor ĠT ED Ġinternal Ġusage Ġonly !!! Ċ Ġ* Ċ Ġ* ĠDao Ġfunctions Ġfor Ġt ed - scheduler Ġ( common Ġfor Ġall Ġdb ) Ċ Ġ*/ Ċ internal Ġabstract Ġclass ĠAbstract Dao ( context : ĠContext ) Ġ: ĠIS cheduler Dao Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Abstract Dao :: class . java ) ĊĊĠĠĠ Ġprivate Ġval ĠdataSource Ġ= Ġcontext . dataSource ĊĠĠĠ Ġprivate Ġval Ġthis System Ġ= Ġcontext . this System ĊĠĠĠ Ġprivate Ġval Ġdb Type Ġ= Ġcontext . db Type ĊĠĠĠ Ġprivate Ġval Ġt ed Task Ġ= Ġcontext . getFull TableName () ĊĊĊĠĠĠ Ġoverride Ġfun Ġlock Task ( connection : ĠConnection , ĠtaskId : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ(" select Ġtask id Ġas Ġlong Val " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġfrom Ġ$ ted Task " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġwhere Ġtask id Ġ= Ġ? " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġ" Ġ+ Ġdb Type . sql (). for Update Skip Locked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġselect Data ( connection , Ġ" lock _ task ", Ġsql , ĠLong Val :: class , ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSch d Jdbc Select . sql Param ( taskId , ĠLONG ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . first OrNull ()?. long Val Ġ== ĠtaskId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġincluding Error Ġ- Ġdo Ġinclude Ġwith Ġstatus ĠERROR ? ĊĠĠĠ Ġ// Ġ' SLEEP ' ? ĊĠĠĠ Ġoverride Ġfun Ġget Active Tasks ( task Name : ĠString , Ġlimit : ĠInt , Ġincluding Error : ĠBoolean ): ĠList < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Log Id Ġ= Ġ" chk _ uniq _ task " ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ(" select Ġtask id Ġas Ġlong Val Ġfrom Ġ$ ted Task Ġwhere Ġsystem Ġ= Ġ'$ this System ' Ġand Ġname Ġ= Ġ? " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġand Ġstatus Ġin Ġ(' NEW ', Ġ' RETRY ', Ġ' WORK '" Ġ+ Ġ( if Ġ( including Error ) Ġ" ,' ERROR '" Ġelse Ġ"") Ġ+ Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġdb Type . sql (). row num ( limit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġselect Data ( sql Log Id , Ġsql , ĠLong Val :: class , ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSch d Jdbc Select . sql Param ( task Name , ĠSTRING ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġreturn Ġresults . map Ġ{ Ġit . long Val !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore From Error ( taskId : ĠLong , Ġtask Name : ĠString , Ġpost p one Sec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Log Id Ġ= Ġ" restore _ from _ error " ĊĠĠĠĠĠĠĠ Ġval Ġpost p one Sec Sql Ġ= Ġdb Type . sql (). interval Seconds ( post p one Sec ) ĊĠĠĠĠĠĠĠ Ġval Ġnow Sql Ġ= Ġdb Type . sql (). now () ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ(" update Ġ$ ted Task Ġset Ġstatus Ġ= Ġ' RETRY ', Ġretries Ġ= Ġretries Ġ+ Ġ 1 ," ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġnext ts Ġ= Ġ$ now Sql Ġ+ Ġ$ post p one Sec Sql " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġwhere Ġsystem Ġ= Ġ'$ this System ' Ġand Ġtask id Ġ= Ġ? Ġand Ġname Ġ= Ġ? " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġand Ġstatus Ġ= Ġ' ERROR '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġexecute Update ( sql Log Id , Ġsql , ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSch d Jdbc Select . sql Param ( taskId , ĠLONG ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSch d Jdbc Select . sql Param ( task Name , ĠSTRING ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck For Error Status ( task Ids : ĠCollection < Long >): ĠList < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Log Id Ġ= Ġ" check _ for _ errors " ĊĠĠĠĠĠĠĠ Ġif Ġ( task Ids . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġin Ids Ġ= Ġtask Ids . join ToString (",") Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ(" select Ġtask id Ġas Ġlong Val Ġfrom Ġ$ ted Task " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġwhere Ġsystem Ġ= Ġ'$ this System '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġand Ġstatus Ġ= Ġ' ERROR '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġand Ġtask id Ġin Ġ($ in Ids )") ĊĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġselect Data ( sql Log Id , Ġsql , ĠLong Val :: class , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġresults . map Ġ{ Ġit . long Val !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind First Task (): ĠLong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ" select Ġmin ( taskId ) Ġas Ġlong Val Ġfrom Ġ$ ted Task Ġwhere Ġsystem Ġ= Ġ'$ this System '" ĊĊĠĠĠĠĠĠĠ Ġreturn Ġselect Data (" min _ task id ", Ġsql , ĠLong Val :: class , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull ()?. long Val ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġdelete Task ( taskId : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġ" delete Ġfrom Ġ$ ted Task Ġwhere ĠtaskId Ġ= Ġ$ taskId " ĊĠĠĠĠĠĠĠ Ġexecute Update (" del _ task ", Ġsql , Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġselect Data ( connection : ĠConnection , Ġsql Log Id : ĠString , Ġsql : ĠString , Ġclazz : ĠK Class < T >, Ġparams : ĠList < Sql Param >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Tm Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠSch d Jdbc Select . select Data ( connection , Ġsql , Ġclazz . java , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ms Ġ= ĠSystem . currentTimeMillis () Ġ- Ġstart Tm ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ms Ġ>= Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġlist . size ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġlist . size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġselect Data ( sql Log Id : ĠString , Ġsql : ĠString , Ġclazz : ĠK Class < T >, Ġparams : ĠList < Sql Param >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Tm Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠSch d Jdbc Select . select Data ( dataSource , Ġsql , Ġclazz . java , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ms Ġ= ĠSystem . currentTimeMillis () Ġ- Ġstart Tm ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ms Ġ>= Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġlist . size ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġlist . size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Update ( sql Log Id : ĠString , Ġsql : ĠString , Ġparams : ĠList < Sql Param >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Tm Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠSch d Jdbc Select . executeUpdate ( dataSource , Ġsql , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ms Ġ= ĠSystem . currentTimeMillis () Ġ- Ġstart Tm ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ms Ġ>= Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġres ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" After Ġ[ {}] Ġtime ={} ms Ġitems ={ }", Ġsql Log Id , Ġduration Ms , Ġres ) ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġprivate Ġclass ĠLong Val Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlong Val : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ