1 | HLEVMST ;O-OIFO/LJA - Event Monitor MASTER JOB ;02/04/2004 14:42
|
---|
2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
|
---|
3 | ;
|
---|
4 | ; Calling STARTJOB always queues a new master job NOW...
|
---|
5 | ;
|
---|
6 | MSTENV ; Display environment to user...
|
---|
7 | ;
|
---|
8 | ;
|
---|
9 | ; Collect Master Job Information
|
---|
10 | ;
|
---|
11 | ;
|
---|
12 | ; Collect Active Event Monitors
|
---|
13 | ;
|
---|
14 | ;
|
---|
15 | Q
|
---|
16 | ;
|
---|
17 | CHECKMST ; Called from outside Event Monitoring, from the Link Manager,
|
---|
18 | ; to see if the master job needs to be started. (See ^HLCSLM.)
|
---|
19 | ; When the Link Manager calls here, two actions potentially occur:
|
---|
20 | ;
|
---|
21 | ; * Check is made whether this CHECKMST code has been run before,
|
---|
22 | ; and if so, how long ago. This check is performed by $$TIMECHK.
|
---|
23 | ; * If never run, or if run more than four hours ago, CHECKMST is run.
|
---|
24 | ;
|
---|
25 | ; CHECKMST checks whether a master job is running, or is properly
|
---|
26 | ; queued. If not, it queues a master job.
|
---|
27 | ;
|
---|
28 | N LAPSE,LASTDT,LASTIEN,NODE,PAR0,RUNOW,RUNTIME,X
|
---|
29 | ;
|
---|
30 | QUIT:'$$TIMECHK ;->
|
---|
31 | ;
|
---|
32 | ; Set last check time for later use by $$TIMECHK...
|
---|
33 | S HLEVLCHK(1)=$$SEC^HLEVMST0($H)
|
---|
34 | ;
|
---|
35 | ; Parameter status check...
|
---|
36 | S PAR0=$G(^HLEV(776.999,1,0)) Q:PAR0']"" ;->
|
---|
37 | I $P(PAR0,U,2)'="A" D QUIT ;-> Not ACTIVE...
|
---|
38 | . D SHOWQUIT("Master job not started. Parameter STATUS is INACTIVE...")
|
---|
39 | ;
|
---|
40 | ; Lapse (since last run) check...
|
---|
41 | S LAPSE=$P(PAR0,U,3) I LAPSE'>0 D QUIT ;->
|
---|
42 | . D SHOWQUIT("Master job not started. Master Job Interval not set up...")
|
---|
43 | ; Get IEN for last master job run
|
---|
44 | S LASTDT=$O(^HLEV(776.2,"B",":"),-1)
|
---|
45 | S LASTIEN=$O(^HLEV(776.2,"B",+LASTDT,":"),-1)
|
---|
46 | ;
|
---|
47 | I LASTIEN'>0 D STARTJOB QUIT ;->
|
---|
48 | S NODE=$G(^HLEV(776.2,+LASTIEN,0))
|
---|
49 | S X=$P(NODE,U,4) I X="E"!(X="P") D STARTJOB QUIT ;->
|
---|
50 | S RUNTIME=$P(NODE,U,6) ; Queue time for last run...
|
---|
51 | S RUNOW=$$RUNEV^HLEVAPI0(RUNTIME,LAPSE+15) ; No start unless 15" overdue
|
---|
52 | I RUNOW D STARTJOB QUIT ;-> 15" overdue!! So, start master job
|
---|
53 | D SHOWQUIT("Master job not started. Not time yet...")
|
---|
54 | ;
|
---|
55 | Q
|
---|
56 | ;
|
---|
57 | TIMECHK() ; Every loop in the Link Manager code in HLCSLM results in one
|
---|
58 | ; call being made to CHECKMST^HLEVMST. The CHECKMST subroutine in turn
|
---|
59 | ; calls here to ensure that the Event Monitor's master job is running
|
---|
60 | ; properly. However, the CHECKMST subroutine should be run by HLCSLM
|
---|
61 | ; only once every four hours. The code in this subroutine uses
|
---|
62 | ; HLEVLCHK(#) variables to ensure that this every four hour rule is
|
---|
63 | ; followed. (HLEVLCHK is newed at the top of HLCSLM.)
|
---|
64 | ;
|
---|
65 | ; Set the time NOW in seconds...
|
---|
66 | S HLEVLCHK(0)=$$SEC^HLEVMST0($H)
|
---|
67 | ;
|
---|
68 | ; This is the time of last check. Make sure it exists...
|
---|
69 | S HLEVLCHK(1)=$G(HLEVLCHK(1))
|
---|
70 | ;
|
---|
71 | ; If no check every made, make a check now...
|
---|
72 | I HLEVLCHK(1)'>0 QUIT 1 ;->
|
---|
73 | ;
|
---|
74 | ; Set the number seconds between NOW and time of last check...
|
---|
75 | S HLEVLCHK(3)=HLEVLCHK(0)-HLEVLCHK(1) ; DIFF = NOW - LAST CHECK
|
---|
76 | ;
|
---|
77 | ; If less than 4 hours since last check, quit w/no check...
|
---|
78 | QUIT:HLEVLCHK(3)<(60*60*4) "" ;->
|
---|
79 | ;
|
---|
80 | Q 1 ; Check should be made...
|
---|
81 | ;
|
---|
82 | SHOWQUIT(TXT) QUIT:$D(ZTQUEUED) ;->
|
---|
83 | W !!,TXT,!
|
---|
84 | Q
|
---|
85 | ;
|
---|
86 | STARTJOB ; Start a new job with optional display to screen...
|
---|
87 | N JOBS
|
---|
88 | S JOBS=$$NEWMSTR(0,1) QUIT:$D(ZTQUEUED) ;->
|
---|
89 | W !!,"New master job queued to task# ",+JOBS,"..."
|
---|
90 | W !,"Entry #",$P(JOBS,U,2)," created in HL7 Monitor Master Job file..."
|
---|
91 | Q
|
---|
92 | ;
|
---|
93 | MASTER ; Whenever a master job starts, here's where it's queued...
|
---|
94 | ; HLEVIENM - req
|
---|
95 | ;
|
---|
96 | N D,D0,DA,DIE,DR,FLD,NOEVCHK,NOPURG,NOW,RES,ZTSKMST
|
---|
97 | ;
|
---|
98 | S ZTREQ="@",NOW=$$NOW^XLFDT
|
---|
99 | ;
|
---|
100 | S ZTSKMST=$G(ZTSK) QUIT:ZTSKMST'>0 ;->
|
---|
101 | ;
|
---|
102 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']"" ;->
|
---|
103 | ;
|
---|
104 | ; Check parameter...
|
---|
105 | I $P($G(^HLEV(776.999,1,0)),U,2)'="A" D QUIT ;->
|
---|
106 | . F FLD=2,3,8 D UPDFLDM(+HLEVIENM,FLD,NOW)
|
---|
107 | . D UPDFLDM(+HLEVIENM,4,"A")
|
---|
108 | ;
|
---|
109 | ; Give (possibly just executed) $$NEWMSTR(0) DIE call time to execute...
|
---|
110 | H 2
|
---|
111 | ;
|
---|
112 | ; Queue next job...
|
---|
113 | S NEWJOB=$$NEWMSTR(1)
|
---|
114 | ;
|
---|
115 | ; What if job requested to stop?
|
---|
116 | I $P($G(^HLEV(776.2,+HLEVIENM,0)),U,4)="S" D QUIT ;->
|
---|
117 | . F FLD=2,3,8 D UPDFLDM(+HLEVIENM,FLD,NOW)
|
---|
118 | . D UPDFLDM(+HLEVIENM,4,"A")
|
---|
119 | ;
|
---|
120 | ; Mark entry to show it successfully started...
|
---|
121 | D UPDFLDM(+HLEVIENM,4,"R")
|
---|
122 | F FLD=3,8 D UPDFLDM(+HLEVIENM,FLD,NOW)
|
---|
123 | D UPDFLDM(+HLEVIENM,50,"Queued job started at "_$$NOW^XLFDT)
|
---|
124 | ;
|
---|
125 | ; Work starts here...
|
---|
126 | KILL NOEVCHK
|
---|
127 | S NOEVCHK=0
|
---|
128 | D EVENTCHK^HLEVAPI0(+HLEVIENM)
|
---|
129 | ;
|
---|
130 | ; Purge MONITOR and MASTER entries...
|
---|
131 | D PURGEALL^HLEVUTIL(+HLEVIENM)
|
---|
132 | ;
|
---|
133 | ; Mark ERROR any monitors still RUNNING by not current..
|
---|
134 | D MARKERR^HLEVAPI3
|
---|
135 | ;
|
---|
136 | ; Done...
|
---|
137 | D UPDFLDM(+HLEVIENM,2,$$NOW^XLFDT)
|
---|
138 | D UPDFLDM(+HLEVIENM,4,"F")
|
---|
139 | D UPDFLDM(+HLEVIENM,50,"Queued job finished at "_$$NOW^XLFDT)
|
---|
140 | D UPDFLDM(+HLEVIENM,50,"# events checked = "_$G(NOEVCHK))
|
---|
141 | S RES=""
|
---|
142 | F S RES=$O(NOEVCHK(RES)) Q:RES']"" D
|
---|
143 | . S RES(1)=$S(RES="E":" were not queued (too early.)",RES="I":" were not queued (inactivated.)",RES="Q":" were queued to execute.",RES="R":" Previous job still running.",RES="X":" errored, for some reason.",1:" have unknown disposition.")
|
---|
144 | . I RES="M" S RES(1)=" M code check failed."
|
---|
145 | . S RES(1)="#"_NOEVCHK(RES)_" Events"_RES(1)
|
---|
146 | . D UPDFLDM(+HLEVIENM,50,RES(1))
|
---|
147 | ;
|
---|
148 | Q
|
---|
149 | ;
|
---|
150 | NEWMSTR(FUTURE,SILENT) ; Create a new master job...
|
---|
151 | ;
|
---|
152 | ; If FUTURE=0, then master job will be queued for NOW...
|
---|
153 | ; If FUTURE=1, then master job will be q'd for CUTMIN in future...
|
---|
154 | ;
|
---|
155 | N CUTMIN,DA,DIC,DIE,DD,DO,DR,HLEVIENM,X,Y,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSK
|
---|
156 | ;
|
---|
157 | ; Should this process be silent?
|
---|
158 | S SILENT=$S($G(SILENT)>0:1,1:0)
|
---|
159 | ;
|
---|
160 | ; Check parameter...
|
---|
161 | I $P($G(^HLEV(776.999,1,0)),U,2)'="A" D QUIT "" ;->
|
---|
162 | . QUIT:$D(ZTQUEUED)!(SILENT) ;->
|
---|
163 | . W !!,"Exiting! Master job not started. Parameter turned off..."
|
---|
164 | . H 2
|
---|
165 | ;
|
---|
166 | ; Make master stub entry...
|
---|
167 | S X=$$NOW^XLFDT,DIC="^HLEV(776.2,",DIC(0)="L"
|
---|
168 | D FILE^DICN
|
---|
169 | S HLEVIENM=$S(+Y>0:+Y,1:"") I HLEVIENM'>0 D QUIT "" ;->
|
---|
170 | . QUIT:$D(ZTQUEUED)!(SILENT) ;->
|
---|
171 | . W !!,"Exiting! Master job not started. Stub record creation failed..."
|
---|
172 | . H 2
|
---|
173 | ;
|
---|
174 | ; Get CUTMIN and queue new job...
|
---|
175 | S CUTMIN=$H ; Default to NOW...
|
---|
176 | I $G(FUTURE) D
|
---|
177 | . S CUTMIN=$O(^HLEV(776.999,":"),-1),CUTMIN=$P($G(^HLEV(776.999,+CUTMIN,0)),U,3)
|
---|
178 | . S CUTMIN=$S(CUTMIN:CUTMIN,1:60) ; Default to 60 minutes between jobs...
|
---|
179 | . S CUTMIN=$$FMTH^XLFDT($$FMADD^XLFDT($$NOW^XLFDT,0,0,CUTMIN))
|
---|
180 | S ZTIO="",ZTDTH=CUTMIN,ZTDESC="HL Master Job - Event Monitoring"
|
---|
181 | S ZTRTN="MASTER^HLEVMST"
|
---|
182 | S ZTSAVE("HLEVIENM")=""
|
---|
183 | D ^%ZTLOAD
|
---|
184 | ;
|
---|
185 | ; Store task #, etc...
|
---|
186 | KILL DA,DD,DIC,DO,X,Y
|
---|
187 | S DA=+HLEVIENM,DIE=776.2,DR="4///Q;5///"_ZTSK_";6////"_$$HTFM^XLFDT(CUTMIN)_";7////"_+DUZ
|
---|
188 | D ^DIE
|
---|
189 | ;
|
---|
190 | I '$D(ZTQUEUED)&('SILENT) D
|
---|
191 | . W !!,"Master job created. Task# ",ZTSK,", and Event# ",HLEVIENM,"..."
|
---|
192 | . H 2
|
---|
193 | ;
|
---|
194 | QUIT $G(ZTSK)_U_HLEVIENM
|
---|
195 | ;
|
---|
196 | UPDFLDM(HLEVIENM,FLD,VAL) ; Update a specific piece in 776.2...
|
---|
197 | N D,D0,DA,DI,DIE,DR
|
---|
198 | ;
|
---|
199 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']""!($G(VAL)']"") ;->
|
---|
200 | ;
|
---|
201 | ; Call call here to store one 50 diary entry. (Required that
|
---|
202 | ; FLD=50 and VAL=Text to store on line. Must call here one time
|
---|
203 | ; for every line to be stored.)
|
---|
204 | I FLD=50 D QUIT ;-> Call call here to store one 50 diary entry
|
---|
205 | . S NODE=$G(^HLEV(776.2,+HLEVIENM,50,0))
|
---|
206 | . S:NODE']"" NODE="^776.201^^"
|
---|
207 | . S CT=$O(^HLEV(776.2,+HLEVIENM,50,":"),-1)+1
|
---|
208 | . S $P(NODE,U,3)=CT,$P(NODE,U,4)=CT
|
---|
209 | . S ^HLEV(776.2,+HLEVIENM,50,0)=NODE
|
---|
210 | . S ^HLEV(776.2,+HLEVIENM,50,+CT,0)=VAL
|
---|
211 | ;
|
---|
212 | I FLD=51 QUIT ;-> Not allowed!
|
---|
213 | ;
|
---|
214 | ; Store zero node information...
|
---|
215 | S DA=+HLEVIENM,DIE=776.2,DR=FLD_"///"_VAL
|
---|
216 | D ^DIE
|
---|
217 | ;
|
---|
218 | Q
|
---|
219 | ;
|
---|
220 | STAMPM(HLEVIENM) ; Update TIMESTAMP field in event..
|
---|
221 | N D,D0,DA,DI,DIE,DR
|
---|
222 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']"" ;->
|
---|
223 | S DA=+HLEVIENM,DIE=776.2,DR="3////"_$$NOW^XLFDT
|
---|
224 | D ^DIE
|
---|
225 | Q
|
---|
226 | ;
|
---|
227 | PURGEM(HLEVIENM) ; Purge master job entries...
|
---|
228 | N CUTIME,IENM,LOOPTM,NOPURG,RETHRM
|
---|
229 | ;
|
---|
230 | ; Check parameter...
|
---|
231 | QUIT:$P($G(^HLEV(776.999,1,0)),U,2)'="A" "" ;->
|
---|
232 | ;
|
---|
233 | S NOPURG=0
|
---|
234 | ;
|
---|
235 | ; Get retention time (HR) for master job data...
|
---|
236 | S RETHRM=$O(^HLEV(776.999,":"),-1)
|
---|
237 | S RETHRM=$P($G(^HLEV(776.999,+RETHRM,0)),U,5)
|
---|
238 | S RETHRM=$S(RETHRM>0:RETHRM,1:96) ; Default to 96 hours
|
---|
239 | ;
|
---|
240 | ; Cutoff time...
|
---|
241 | S CUTIME=$$FMADD^XLFDT($$NOW^XLFDT,0,-RETHRM)
|
---|
242 | ;
|
---|
243 | F S CUTIME=$O(^HLEV(776.2,"B",CUTIME),-1) Q:CUTIME'>0 D
|
---|
244 | . S IEN=0
|
---|
245 | . F S IEN=$O(^HLEV(776.2,"B",CUTIME,IEN)) Q:IEN'>0 D
|
---|
246 | . . QUIT:IEN=HLEVIENM ;-> Don't delete yourself!!
|
---|
247 | . . S NOPURG=NOPURG+1
|
---|
248 | . . D PURGEME^HLEVUTIL(+IEN) ; Delete events in master job...
|
---|
249 | . . D DELETE^HLEVUTIL(776.2,+IEN)
|
---|
250 | ;
|
---|
251 | Q NOPURG
|
---|
252 | ;
|
---|
253 | EOR ;HLEVMST - Event Monitor MASTER JOB ;5/16/03 14:42
|
---|