Wachtrij met opdrachten voor de scheduler
Een opdracht is van het type VHSys.Scheduler.Task
persistent
%VHMacro,VHSys.Scheduler
1
TaskQueue
%Persistent,VHSys.Scheduler.QueueAbstract
61277,49478.557161
60760,38835.671686
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