| 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 | 
|---|