Wachtrij met opdrachten voor de scheduler Een opdracht is van het type VHSys.Scheduler.Task persistent vhLib.Macro,VHSys.Scheduler 1 TaskQueue %Persistent,VHSys.Scheduler.QueueAbstract 0 VHSys.Scheduler.BL.SchedulerAbstract VHSysSchedulerAbstract Moet zonder quotes, anders zinloos. Oplossing zoeken via correcte Caché implementatie !!! Voorlopig moeten de ClassMethods die embedded sql bevatten, overschreven worden en de Sql-table name manueel aangepast worden. VHSys_Scheduler.TaskQueue 1 1 97 inherited from QueueAbstract *** / /*** ***/ ]]> Task 1 Method AAACompilerFirst() moet eerst staan in alfabetische lijst, want moet als eerste gecompileerd worden! 1 objectgenerator Task:%RegisteredObject,RunMode:%String %Status 0:Task.MaxBusyTime, 1:..CalcMaxBusyTime()) Quit $$$OK ]]> Priority:%String="" %Status %Status %Status NewClass:%String %RegisteredObject Geeft 1 als de MaxBusyTime nog niet overschreden is, en 0 als een process toch langer loopt dan de MaxBusyTime. DeltaT als .local doorgeven om de berekende Busy Time (=Now-StartTime) terug te krijgen. %Boolean 0) MaxBusyTime=$$$MaxBusyTimeDFL Set DeltaT=$$$NowNum-$$HToNum^vhLib($S(..Started>0:..Started, ..Created>0:..Created, 1:"60631,0")) ;d WL^vhDBG("NowNum:"_$$$NowNum_" Started:"_$$HToNum^vhLib(..Started)_" ("_..Started_")") Quit (DeltaT Berekent een ruime schatting van de maximale tijd voor de verwerking van de Task Op basis van een aantal parameters : RunMode, ... %Integer Wijzigt de status van de QItem. Indien het object reeds bewaard werd en blnSaveObj = true, dan wordt het object opnieuw bewaard. NewStatus:%String,blnSaveObj:%Boolean=1 %Status De waarde van PrioValue (%Integer) wordt meteen gekopieerd naar Priority als PrioValue tussen 1 en 10 (incl.), anders waarde "" of 10 Value:%Integer %Status - Type=$$$qptValue : Prio=numerieke waarde (%Integer) tussen 1 en 10 (incl.) - Type=$$$qptCode : Prio=code L/M/H (Low/Medium/High) --> Priority is resp. 2, 5, 8 - Type=$$$qptRunMode : Prio=code B/A/S (Batch/Async/Sync) --> Code is resp. Low, Medium, High - Type=$$$qptAuto : systeem kiest tussen "by Value" of "by Code" naargelang de waarde van Prio. Indien blnCalc, dan wordt de numerieke Priority berekend voor de gegeven Prio of indien Prio="" met de huidige PrioCode/RunMode (enkel bij "Code" of "Auto").
]]>
Type:%String,Prio:%String="",blnCalc:%Boolean=1 %Status
Instellen van de Priority volgens RunMode; Vertrekkende van de waarde van RunMode worden de PrioCode en PrioValue ingevuld %Status Lock or Unlock the SingleLockKey of the QueueItem. strOnOff should be "+" or "-" (default:"+") strOnOff:%String="+",LockTimeOut:%Integer=10 ClassMethod: info zie method SetSingleLock() 1 SingleLockKey:%String,strOnOff:%String="+",LockTimeOut:%Integer=10 1 SingleLockKey:%String 0 %Boolean Geeft het eerstvolgende Item van de queue (in status "W"ait) gesorteerd op prioriteit. De hoogste prioriteit eerst, bij gelijke wordt het kleinste ID gekozen (created first)/ 1 blnCheckMaxBusy:%Boolean=1 %RegisteredObject GetNextTask") Quit:(blnCheckMaxBusy)&&(..GetMaxBusyTasks("")=0) "" Set QItemID=$$gntNextID() Quit:(QItemID="") "" Set QItem=..%OpenId(QItemID) Quit QItem gntNextID() Set NextID="" &SQL(DECLARE crsNextQItem CURSOR FOR SELECT ID, SingleLockKey INTO :NextID, :SingleLockKey FROM VHSys_Scheduler.TaskQueue WHERE Status=$$$qsWait ORDER BY Priority DESC, ID) &SQL(OPEN crsNextQItem) For &SQL(FETCH crsNextQItem) Quit:(SQLCODE) Do:($L(SingleLockKey)) Quit:($L(NextID)) . ;d WL^vhDBG("NextID?") . Set:(..IsSingleLocked(SingleLockKey)) NextID="" &SQL(CLOSE crsNextQItem) ;d WL^vhDBG("NextID:"_$G(NextID)) ; _" Status:"_$G(Status)) Quit $G(NextID) /* gntNextID() Kill NextID ;&SQL(SELECT Top 1 (ID) INTO :NextID FROM VHSys_Scheduler.TaskQueue WHERE Status=$$$qsWait ORDER BY Priority DESC, ID) Quit:(SQLCODE) "" Quit $G(NextID) */ ]]> Geeft het aantal vrije processen terug. Indien Prio groter dan nul, berekent het aantal vrije processen voor de gegeven Prioriteit. 1 Prio:%Integer=0 %Integer 0:"[for Prio_"_Prio_"]",1:"")_" MaxAllowed:"_MaxBusy_" Busy:"_(MaxBusy-CntFree)_" Free Processes:"_$$$Max(0,CntFree)) Else Do . // Voor complexere situaties / andere verdeling van de Free Tasks . Set lbBusy=..ListBusyTasks() . Set CntFree=(MaxBusy-$$$SumAllBusy) Set:(CntFree<0) CntFree=0 Quit CntFree ]]> Maximaal aantal taken die tegelijk mogen uitgevoerd worden. Kan voor iedere prioriteit apart gedefinieerd worden. Belangrijkste oproep vanuit method ..CountFreeProcesses() Door MaxBusyTask (subnode "MaxBusyTask") op 0 te zetten, wordt de scheduler ge-suspended. 1 PrioCode:%String %String Geeft het aantal processen terug dat in de queue op Status "B"usy of "S"tarted staan. 1 Geeft een $LB() met het aantal processen terug dat in de queue op Status "B"usy of "S"tarted staan, gegroepeerd per Prioriteit (per cCode: Low/Medium/High) bvb. $LB(1,0,2) ; Busy: (1 x L) + (0 x M) + (2 x H) 1 %List 1 Geeft het aantal processen terug dat in de queue op Status "B"usy of "S"tarted staan. 1 %SQLQuery SELECT ID, Status, Priority, Task, PrioCode, Created, Started, Finished, InternePersoon FROM VHSys_Scheduler.TaskQueue ORDER BY StatusNum, Priority DESC, ID %Library.CacheStorage ^VHSys.Scheduler.QueueItemD QueueItemDefaultData ^VHSys.Scheduler.QueueItemD ^VHSys.Scheduler.QueueItemI ^VHSys.Scheduler.QueueItemS %%CLASSNAME Created FeedBack Finished InternePersoon LogType MaxBusyTime PrioCode PrioValue Priority RunMode SignalPID Started Status Task ThreadedPID SingleLockKey