| 1 | VDEFMON ;BPOIFO/JG - VDEF Queue Process Monitor ; 20 Dec 2005  13:00 PM | 
|---|
| 2 | ;;1.0;VDEF;**3**;Dec 28, 2004 | 
|---|
| 3 | ;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | Q  ; No bozos | 
|---|
| 6 | ; | 
|---|
| 7 | START ; Main entry point for scheduling queue processor monitor in TaskMan | 
|---|
| 8 | I '$D(ZTQUEUED) W !,"Must be run from TaskMan." Q | 
|---|
| 9 | ; | 
|---|
| 10 | START1 ; Non-TaskMan entry | 
|---|
| 11 | ; | 
|---|
| 12 | ; Only one of these needs to be running. | 
|---|
| 13 | L +^VDEFHL7("REQMON"):1 Q:'$T | 
|---|
| 14 | ; | 
|---|
| 15 | ; Start the Request Queue processor monitor | 
|---|
| 16 | N ZTDESC,ZTDTH,ZTIO,ZTPRI,ZTRTN,ZTSK | 
|---|
| 17 | S ZTRTN="MONITOR^VDEFMON",(ZTIO,ZTPRI)="",ZTDTH=$H | 
|---|
| 18 | S ZTDESC="VDEF Request Processor Monitor" | 
|---|
| 19 | L -^VDEFHL7("REQMON") | 
|---|
| 20 | D ^%ZTLOAD | 
|---|
| 21 | ; | 
|---|
| 22 | ; Check that TaskMan successfully queued up the Monitor task | 
|---|
| 23 | I '$G(ZTSK) D ALERT^VDEFUTIL("VDEF QUEUE PROCESS MONITOR DID NOT START. CHECK ERROR TRAP.") | 
|---|
| 24 | Q | 
|---|
| 25 | ; | 
|---|
| 26 | ; Main entry point for the Request Queue process monitor from TaskMan. | 
|---|
| 27 | ; Check the Request Queue processor for each queue that is defined | 
|---|
| 28 | ; and has a status of "R" (running). If it is not running, send an alert | 
|---|
| 29 | ; and restart it. | 
|---|
| 30 | ; If the Request Queue is currently suspended, send an alert telling | 
|---|
| 31 | ; site to restart it. | 
|---|
| 32 | MONITOR L +^VDEFHL7("REQMON"):1 Q:'$T | 
|---|
| 33 | N QIEN,QUEFAIL,QUESTOP,VDEFTSK S VDEFTSK=ZTSK | 
|---|
| 34 | MONITOR1 S QIEN=0 | 
|---|
| 35 | F  S QIEN=+$O(^VDEFHL7(579.3,QIEN)) Q:'QIEN  D  D ALERTSUS:QUESTOP,ALERT:QUEFAIL | 
|---|
| 36 | . S (QUESTOP,QUEFAIL)=0 | 
|---|
| 37 | . S QUESTOP=$P(^VDEFHL7(579.3,QIEN,0),U,9)="S" Q:QUESTOP | 
|---|
| 38 | . ; | 
|---|
| 39 | . ; Try to lock this Request Queue. If it's already locked, | 
|---|
| 40 | . ; assume that the Request queue processor is running OK. | 
|---|
| 41 | . L +^VDEFHL7(579.3,"QUEUE",QIEN):1 S QUEFAIL=$T | 
|---|
| 42 | . L -^VDEFHL7(579.3,"QUEUE",QIEN) | 
|---|
| 43 | ; | 
|---|
| 44 | ; Requeue any requests that are stuck in Checked Out or Errored Out status. | 
|---|
| 45 | S QIEN=0 N RQ | 
|---|
| 46 | F  S QIEN=+$O(^VDEFHL7(579.3,QIEN)) Q:'QIEN  D | 
|---|
| 47 | . I +$O(^VDEFHL7(579.3,"C","C",QIEN,"")) D | 
|---|
| 48 | .. D REQUEUE^VDEFQM(QIEN,.RQ) | 
|---|
| 49 | .. D:RQ ALERT^VDEFUTIL("VDEF HAS REQUEUED CHECKED OUT RECORDS. NO ACTION NEEDED.") | 
|---|
| 50 | . I +$O(^VDEFHL7(579.3,"C","E",QIEN,"")) D | 
|---|
| 51 | .. D RQERR^VDEFQM(QIEN,.RQ) | 
|---|
| 52 | .. D:RQ ALERT^VDEFUTIL("VDEF HAS REQUEUED ERRORED OUT RECORDS. NO ACTION NEEDED.") | 
|---|
| 53 | ; | 
|---|
| 54 | ; Wait for 10 minutes before checking the queue processors again. | 
|---|
| 55 | ; The wait process is in a loop so it can check if there | 
|---|
| 56 | ; has been a request to stop processing before the wait expires. | 
|---|
| 57 | WAITLOOP N I F I=1:1:600 D  Q:ZTSTOP | 
|---|
| 58 | . S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP | 
|---|
| 59 | . H 1 | 
|---|
| 60 | ; | 
|---|
| 61 | ; Quit or resume processing | 
|---|
| 62 | G MONITOR1:'$G(ZTSTOP) | 
|---|
| 63 | ; | 
|---|
| 64 | ; Send an alert and delete this task's record | 
|---|
| 65 | EXIT D ALERT^VDEFUTIL("VDEF QUEUE PROCESS MONITOR HAS EXITED.") | 
|---|
| 66 | L -^VDEFHL7("REQMON") | 
|---|
| 67 | S ZTSK=VDEFTSK,ZTSTOP=1,ZTREQ="@" | 
|---|
| 68 | Q | 
|---|
| 69 | ; | 
|---|
| 70 | ; Generate the failure/restart alert | 
|---|
| 71 | ALERT N QUEUE,Y D ALERTDAT | 
|---|
| 72 | D ALERT^VDEFUTIL("VDEF QUEUE '"_QUEUE_"' AUTO-RESTARTED. NO ACTION REQUIRED.") | 
|---|
| 73 | ; | 
|---|
| 74 | ; Restart the Request Queue processor | 
|---|
| 75 | D REQ^VDEFCONT(QIEN) | 
|---|
| 76 | Q | 
|---|
| 77 | ; | 
|---|
| 78 | ; Generate the alert that a Request Queue is suspended. | 
|---|
| 79 | ALERTSUS N QUEUE,Y D ALERTDAT | 
|---|
| 80 | D ALERT^VDEFUTIL("VDEF QUEUE '"_QUEUE_"' IS SUSPENDED. PLEASE START IT.") | 
|---|
| 81 | Q | 
|---|
| 82 | ; | 
|---|
| 83 | ; Get the queue name | 
|---|
| 84 | ALERTDAT S QUEUE=$P(^VDEFHL7(579.3,QIEN,0),U) | 
|---|
| 85 | Q | 
|---|