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