1 | VDEFCONT ;INTEGIC/AM & BPOIFO/JG - VDEF CONTROL PROGRAM ; 16 Nov 2005 1:08 PM
|
---|
2 | ;;1.0;VDEF;**3**;Dec 28, 2004
|
---|
3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ; IA: 10063 - $$S^%ZTLOAD
|
---|
6 | ; 10063 - $$ASKSTOP^%ZTLOAD
|
---|
7 | ;
|
---|
8 | Q ; No bozos
|
---|
9 | ;
|
---|
10 | START ; Main entry point for scheduling queue processor jobs at Taskman
|
---|
11 | ; Startup time
|
---|
12 | I '$D(ZTQUEUED) W !,"Must be run from TaskMan." Q
|
---|
13 | ;
|
---|
14 | ; Start Request Queue processors
|
---|
15 | N QIEN F QIEN=0:0 S QIEN=$O(^VDEFHL7(579.3,QIEN)) Q:'QIEN D REQ(QIEN)
|
---|
16 | ;
|
---|
17 | ; Start the checked out request monitor job
|
---|
18 | D MONCHKO
|
---|
19 | ;
|
---|
20 | ; Start the Request Queue processor monitor job
|
---|
21 | D START^VDEFMON
|
---|
22 | Q
|
---|
23 | ;
|
---|
24 | MONCHKO ; Start the VDEF job to monitor checked out requests
|
---|
25 | N ARR,ERR,FDA,ZTDESC,ZTDTH,ZTIO,ZTPRI,ZTRTN,ZTSK
|
---|
26 | ;
|
---|
27 | ; Check the status of the last VDEF Monitor task.
|
---|
28 | D GETS^DIQ(579.5,"1,",".01;.02;.06","I","ARR","ERR")
|
---|
29 | ; Don't start a new one if old one is scheduled.
|
---|
30 | S ZTSK=+$G(ARR(579.5,"1,",.06,"I")) D STAT^%ZTLOAD
|
---|
31 | I ZTSK(1)=1 Q
|
---|
32 | ;
|
---|
33 | ; Schedule a new task.
|
---|
34 | S ZTRTN="MONITOR^VDEFCONT",ZTDESC="VDEF Checked Out Monitor"
|
---|
35 | ;
|
---|
36 | ; Calculate when to run the VDEF Monitor next time
|
---|
37 | S ZTDTH=$$FUTURE^VDEFUTIL($G(ARR(579.5,"1,",.02,"I")))
|
---|
38 | S (ZTPRI,ZTIO)=""
|
---|
39 | D ^%ZTLOAD
|
---|
40 | ;
|
---|
41 | ; Check that TaskMan successfully queued up the Monitor task
|
---|
42 | I '$G(ZTSK) D ALERT^VDEFUTIL("VDEF CHECKED OUT MONITOR FAILED TO START. CHECK ERROR TRAP.")
|
---|
43 | ;
|
---|
44 | ; File the task number of the task that has been queued up
|
---|
45 | I $G(ZTSK) S FDA(1,579.5,"1,",.06)=ZTSK D FILE^DIE("","FDA(1)","ERR(1)")
|
---|
46 | Q
|
---|
47 | ;
|
---|
48 | MONITOR ; VDEF monitor task, executed on a schedule determined by queue
|
---|
49 | ; parameter 'CHECK OUT TIME LIMIT'. Checks for potentially hung
|
---|
50 | ; 'Checked Out' entries in the Request Queues
|
---|
51 | ;
|
---|
52 | N QIEN S (ZTSTOP,QIEN)=0
|
---|
53 | F S QIEN=$O(^VDEFHL7(579.3,"C","C",QIEN)) Q:'QIEN D Q:ZTSTOP
|
---|
54 | . N IEN,LIMIT,QUEUE,QUEUENAM,QUIT
|
---|
55 | . ;
|
---|
56 | . ; Retrieve queue data
|
---|
57 | . D GETS^DIQ(579.3,QIEN_",",".01;.04;.05","I","QUEUE","ERR")
|
---|
58 | . S QUEUENAM=$G(QUEUE(579.3,QIEN_",",.01,"I"))
|
---|
59 | . ;
|
---|
60 | . ; Check-out Time Limit in seconds
|
---|
61 | . S LIMIT=$G(QUEUE(579.3,QIEN_",",.05,"I"))
|
---|
62 | . ;
|
---|
63 | . ; Get a list of currently Checked-out Requests in this queue
|
---|
64 | . S IEN=0 F S IEN=$O(^VDEFHL7(579.3,"C","C",QIEN,IEN)) Q:'IEN D Q:ZTSTOP
|
---|
65 | .. S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP
|
---|
66 | .. N CHECKOUT,ENTRY,ERR,FDA
|
---|
67 | .. ;
|
---|
68 | .. ; Get the related data for the request
|
---|
69 | .. D GETS^DIQ(579.31,IEN_","_QIEN_",",".01;.02;.09;.15","I","ENTRY","ERR")
|
---|
70 | .. ;
|
---|
71 | .. ; Quit if Vista HL7 IRM already notified or if status is not "C"
|
---|
72 | .. Q:$G(ENTRY(579.31,IEN_","_QIEN_",",.15,"I"))'=""
|
---|
73 | .. Q:$G(ENTRY(579.31,IEN_","_QIEN_",",.02,"I"))'="C"
|
---|
74 | .. ;
|
---|
75 | .. ; Get the date when the request was checked out and compare with
|
---|
76 | .. ; CHECK OUT TIME LIMIT parameter.
|
---|
77 | .. S CHECKOUT=$G(ENTRY(579.31,IEN_","_QIEN_",",.09,"I"))
|
---|
78 | .. ;
|
---|
79 | .. ; If no checkout time, don't create a false alert.
|
---|
80 | .. Q:'CHECKOUT
|
---|
81 | .. Q:$$DIFF^VDEFUTIL(CHECKOUT,$H)'>LIMIT
|
---|
82 | .. ;
|
---|
83 | .. ; Request appears hung. Send a message to the Vista HL7 IRM.
|
---|
84 | .. D ALERT^VDEFUTIL("RECORD "_IEN_" IN VDEF QUEUE '"_$E(QUEUENAM,1,35)_"' HUNG IN CHECKED OUT STATUS.")
|
---|
85 | .. ;
|
---|
86 | .. ; Update the time stamp in the entry so that the VDEF Monitor
|
---|
87 | .. ; doesn't notify the Vista HL7 IRM more than once.
|
---|
88 | .. L +^VDEFHL7(579.3,QIEN,IEN)
|
---|
89 | .. D NOW^%DTC S FDA(1,579.31,IEN_","_QIEN_",",.15)=%
|
---|
90 | .. D FILE^DIE("","FDA(1)","ERR(1)")
|
---|
91 | .. L -^VDEFHL7(579.3,QIEN,IEN)
|
---|
92 | .. Q
|
---|
93 | ;
|
---|
94 | ; Check if TaskMan requested a stop
|
---|
95 | I ZTSTOP S X=$$ASKSTOP^%ZTLOAD(ZTSK),ZTREQ="@" Q
|
---|
96 | ;
|
---|
97 | PURGE ; Purge old entries in Request Queues
|
---|
98 | S (ZTSTOP,QIEN)=0
|
---|
99 | F S QIEN=$O(^VDEFHL7(579.3,"C","P",QIEN)) Q:'QIEN D Q:ZTSTOP
|
---|
100 | . N ARCH,IEN,QUEUE,QUIT
|
---|
101 | . ; Retrieve queue data
|
---|
102 | . D GETS^DIQ(579.3,QIEN_",",".04","I","QUEUE","ERR")
|
---|
103 | . ; Retrieve the queue's Archival Parameter (in seconds)
|
---|
104 | . S ARCH=$G(QUEUE(579.3,QIEN_",",.04,"I"))
|
---|
105 | . ; Initialize the flag that indicates whether the oldest Processed
|
---|
106 | . ; entry in a given Request Queue is too recent to be purged
|
---|
107 | . S QUIT=0
|
---|
108 | . ; Loop through the list of "P"rocesses entries in this Request
|
---|
109 | . ; Queue, starting with the oldest
|
---|
110 | . F IEN=0:0 S IEN=$O(^VDEFHL7(579.3,"C","P",QIEN,IEN)) Q:'IEN D Q:QUIT!ZTSTOP
|
---|
111 | .. S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP
|
---|
112 | .. N DTS,ENTRY,ERR,FDA
|
---|
113 | .. ; Get this entry's data
|
---|
114 | .. D GETS^DIQ(579.31,IEN_","_QIEN_",",".13","I","ENTRY","ERR")
|
---|
115 | .. I $D(ERR) ; Add error processing here
|
---|
116 | .. ; Retrieve the DTS when the Request was "P"rocessed
|
---|
117 | .. S DTS=$G(ENTRY(579.31,IEN_","_QIEN_",",.13,"I"))
|
---|
118 | .. ; Calculate how long it has been since this Request was "P"rocessed
|
---|
119 | .. ; and, if the Request is more recent than the Archival Parameter
|
---|
120 | .. ; for this Queue, set the "Quit" flag and stop processing the Queue
|
---|
121 | .. I $$DIFF^VDEFUTIL(DTS,$H)<ARCH S QUIT=1 Q
|
---|
122 | .. ; If we are here, then the entry is older than allowed by the
|
---|
123 | .. ; Archival Parameter - purge this entry from the Request Queue
|
---|
124 | .. S FDA(1,579.31,IEN_","_QIEN_",",.01)="@"
|
---|
125 | .. D FILE^DIE("","FDA(1)","ERR(1)")
|
---|
126 | ;
|
---|
127 | ; Stop if TaskMan requested
|
---|
128 | I ZTSTOP S X=$$ASKSTOP^%ZTLOAD(ZTSK),ZTREQ="@" Q
|
---|
129 | ;
|
---|
130 | ; Reschedule VDEF checked out monitor
|
---|
131 | D MONCHKO
|
---|
132 | S ZTREQ="@"
|
---|
133 | Q
|
---|
134 | ;
|
---|
135 | REQ(QIEN) ; Start a Request Queue Processor task for a single queue
|
---|
136 | ; Try locking the Request Queue - if we fail, then there is
|
---|
137 | ; another Request Processor currently holding the lock, so skip it
|
---|
138 | L +^VDEFHL7(579.3,"QUEUE",QIEN):3 Q:'$T
|
---|
139 | N ERR,FDA,QNAME,QUEUE,ZTDESC,ZTDTH,ZTIO,ZTPRI,ZTRTN,ZTSAVE,ZTSK
|
---|
140 | ; Retrieve queue data
|
---|
141 | D GETS^DIQ(579.3,QIEN_",",".01;.02;.07;.08;.09","I","QUEUE","ERR")
|
---|
142 | ; If this Request Queue is suspended, quit
|
---|
143 | I $G(QUEUE(579.3,QIEN_",",.09,"I"))="S" G REQX
|
---|
144 | ; TaskMan task number of the last Request Processor task for this queue
|
---|
145 | S ZTSK=+$G(QUEUE(579.3,QIEN_",",.08,"I"))
|
---|
146 | ; Check the status of the last Request Processor task
|
---|
147 | D STAT^%ZTLOAD
|
---|
148 | ; If the task is scheduled to run, then don't submit a new one - this
|
---|
149 | ; means that the system is coming back after a restart which occurred
|
---|
150 | ; while an old Request Processor task was scheduled for running
|
---|
151 | I ZTSK(1)=1 G REQX
|
---|
152 | ;
|
---|
153 | ; Create TaskMan variables
|
---|
154 | S ZTRTN="EN^VDEFREQ",(ZTIO,ZTPRI)=""
|
---|
155 | S QNAME=$G(QUEUE(579.3,QIEN_",",.01,"I"))
|
---|
156 | S ZTDESC="VDEF Request Processor for "_QNAME
|
---|
157 | S ZTSAVE("QIEN")=QIEN,ZTDTH=$H
|
---|
158 | D ^%ZTLOAD
|
---|
159 | ; Check that TaskMan created the task.
|
---|
160 | I '$G(ZTSK) D ALERT^VDEFUTIL("VDEF REQUEST PROCESS "_$E(QNAME,1,20)_" FAILED TO START. CHECK ERROR TRAP.")
|
---|
161 | ; File the task number of the task that has been queued up
|
---|
162 | I $G(ZTSK) D
|
---|
163 | . S FDA(1,579.3,QIEN_",",.08)=ZTSK
|
---|
164 | . D FILE^DIE("","FDA(1)","ERR(1)")
|
---|
165 | REQX L -^VDEFHL7(579.3,"QUEUE",QIEN)
|
---|
166 | Q
|
---|