DBA Data[Home] [Help]

PACKAGE BODY: APPS.XNP_TIMER_MGR

Source


1 PACKAGE BODY xnp_timer_mgr AS
2 /* $Header: XNPTMGRB.pls 120.1 2005/06/17 03:49:28 appldev  $ */
3 
4   G_NEW_LINE char := fnd_global.local_chr(10) ;
5 
6 /* forward declaration */
7 
8 PROCEDURE start_actual_timer( p_timer_code IN VARCHAR2,
9 		p_dummy_header IN xnp_message.msg_header_rec_type,
10 		p_dummy_text IN VARCHAR2,
11 		x_error_code OUT NOCOPY NUMBER,
12 		x_error_message OUT NOCOPY VARCHAR2);
13 
14 PROCEDURE move_to_inbound(
15 		p_msg_header IN xnp_message.msg_header_rec_type,
16 		p_msg_text IN VARCHAR2,
17  		x_error_code OUT NOCOPY NUMBER,
18 		x_error_message OUT NOCOPY VARCHAR2);
19 
20 /**********************************************************************
21 *****  Procedure:    PROCESS()
22 *****  Purpose:      Checks if a timer message has arrived and starts
23 *****                the actual timer for a dummy timer.  In case the
24 *****                the dequeued message is an actual timer, it
25 *****                enqueus it back on the inbound message Q.
26 ***********************************************************************/
27 
28 PROCEDURE process
29  (p_queue_name IN VARCHAR2
30  )
31  IS
32 
33 /*  declare all local variables here  */
34 
35   l_error_code NUMBER ;
36   l_error_message VARCHAR2(4000) ;
37 
38   l_msg_header     xnp_message.msg_header_rec_type ;
39 
40   -- Change to CLOB
41 
42   l_msg_text       VARCHAR2(32767) ;
43   l_operation      VARCHAR2(4000) := NULL ;
44   l_description    VARCHAR2(4000) := NULL ;
45   l_fnd_message    VARCHAR2(4000) := NULL ;
46   l_in_tmr_q       NUMBER ;
47   l_next_timer	   VARCHAR2(20);
48 
49   invalid_dummy_timer		EXCEPTION;
50   failed_to_move_message	EXCEPTION;
51   timer_start_failed		EXCEPTION;
52   failed_to_update_status	EXCEPTION;
53 
54 BEGIN
55 
56 	l_error_code := 0 ;
57 	l_error_message := NULL ;
58 
59 	/*  dequeue a message from the AQ */
60 
61 	SAVEPOINT	dequeue_timer ;
62 
63 	xnp_message.pop (p_queue_name => p_queue_name,
64 			x_msg_header => l_msg_header,
65 			x_body_text => l_msg_text,
66 			x_error_code => l_error_code,
67 			x_error_message => l_error_message
68 			) ;
69 
70 	/*  check if the pop timed out */
71 
72 	IF ( l_error_code = xnp_errors.g_dequeue_timeout ) THEN
73 		COMMIT ;
74 		RETURN ;
75 	END IF ;
76 
77 /*  check if it is a control message to stop the timer server */
78 
79 /*
80 
81 -- adabholk 03/2001
82 -- performance changes
83 -- This code is not required
84 
85 	IF (l_msg_header.message_code  = 'TMR_SERVER')
86 	THEN
87 		xnp_xml_utils.decode(l_msg_text, 'OPERATION', l_operation) ;
88 		IF (l_operation = 'STOP') THEN
89 			COMMIT;
90 		END IF ;
91 	END IF;
92 */
93 
94 	IF (l_msg_header.message_code  = 'T_DUMMY')
95 	THEN
96 
97 	/* update dummy timer status to EXPIRED */
98 
99 	xnp_timer_core.update_timer_status(
100 			p_timer_id => l_msg_header.message_id,
101 			p_status => 'EXPIRED',
102 			x_error_code => l_error_code,
103 			x_error_message => l_error_message);
104 
105 	IF (l_error_code <> 0) THEN
106 		RAISE failed_to_update_status;
107 	END IF ;
108 
109 	/*
110 	** Get the actual message from the timer registry
111 	** Next_Timer column for the timer_id
112 	*/
113 		l_next_timer := xnp_timer_core.get_next_timer
114 					(l_msg_header.message_id);
115 
116 		IF (l_next_timer IS NULL)
117 		THEN
118 			RAISE invalid_dummy_timer;
119 		END IF;
120 
121 		/* Start Actual Timer */
122 
123     		start_actual_timer(l_next_timer,
124 				l_msg_header,
125 				l_msg_text,
126 				l_error_code,
127 				l_error_message);
128 
129 		/* check for error code/message */
130 
131 		IF (l_error_code <> 0) THEN
132 			RAISE timer_start_failed ;
133 		END IF;
134 
135 	ELSE
136 		/* update dummy timer status to EXPIRED */
137 
138 		xnp_timer_core.update_timer_status(
139 			p_timer_id => l_msg_header.message_id,
140 			p_status => 'EXPIRED',
141 			x_error_code => l_error_code,
142 			x_error_message => l_error_message);
143 
144 
145 		IF (l_error_code = 0) THEN
146 
147 			move_to_inbound(l_msg_header,
148 				l_msg_text,
149 				l_error_code,
150 				l_error_message);
151 
152 			IF (l_error_code <> 0) THEN
153 				RAISE failed_to_move_message ;
154 			END IF;
155 		ELSE
156 			RAISE failed_to_update_status;
157 
158 		END IF ;
159 
160 	END IF;
161 
162 	COMMIT ;
163 
164 	EXCEPTION
165 
166     	WHEN invalid_dummy_timer THEN
167 
168 		ROLLBACK TO dequeue_timer ;
169 
170          	fnd_message.set_name ('XNP', 'INVALID_DUMMY_TIMER') ;
171 
172          	fnd_message.set_token ('DUMMY_TIMER_ID',
173 				l_msg_header.message_id) ;
174 
175          	l_fnd_message:= FND_MESSAGE.get ;
176 
177 		xnp_message.update_status(l_msg_header.message_id,
178 				'FAILED',
179 				l_fnd_message) ;
180 
181     	WHEN timer_start_failed THEN
182 
183 		ROLLBACK TO dequeue_timer ;
184 
185          	fnd_message.set_name ('XNP', 'START_TIMER_FAILED') ;
186 
187 
188          	fnd_message.set_token ('ACTUAL_TIMER_CODE',
189 				l_next_timer) ;
190 
191          	fnd_message.set_token ('ERROR_CODE',
192 				l_error_code) ;
193 
194          	fnd_message.set_token ('ERROR_MESSAGE',
195 				l_error_message) ;
196 
197          	l_fnd_message:= FND_MESSAGE.get ;
198 
199 		xnp_message.update_status(l_msg_header.message_id,
200 				'FAILED',
201 				l_fnd_message) ;
202 
203     	WHEN failed_to_move_message THEN
204 
205 		ROLLBACK TO dequeue_timer ;
206 
207          	fnd_message.set_name ('XNP', 'TIMER_MOVE_FAILED') ;
208 
209          	fnd_message.set_token ('TIMER_ID',
210 				l_msg_header.message_id) ;
211 
212          	fnd_message.set_token ('ERROR_CODE',
213 				l_error_code) ;
214 
215          	fnd_message.set_token ('ERROR_MESSAGE',
216 				l_error_message) ;
217 
218          	l_fnd_message:= FND_MESSAGE.get ;
219 
220 		xnp_message.update_status(l_msg_header.message_id,
221 				'FAILED',
222 				l_fnd_message) ;
223 
224 	/* failed to update timer status in registry */
225 
226     	WHEN failed_to_update_status THEN
227 
228 		ROLLBACK TO dequeue_timer ;
229 
230          	fnd_message.set_name ('XNP', 'UPDATE_TIMER_STATUS_FAILED') ;
231 
232          	fnd_message.set_token ('TIMER_ID',
233 				l_msg_header.message_id) ;
234 
235          	fnd_message.set_token ('ERROR_CODE',
236 				l_error_code) ;
237 
238          	fnd_message.set_token ('ERROR_MESSAGE',
239 				l_error_message) ;
240 
241          	l_fnd_message:= FND_MESSAGE.get ;
242 
243 		xnp_message.update_status(l_msg_header.message_id,
244 				'FAILED',
245 				l_fnd_message) ;
246 END process;
247 
248 
249 PROCEDURE process(
250 	p_queue_name IN VARCHAR2,
251 	p_correlation_id IN VARCHAR2,
252 	x_queue_timed_out OUT NOCOPY VARCHAR2 )
253 IS
254 
255 /*  declare all local variables here  */
256 
257   l_error_code NUMBER ;
258   l_error_message VARCHAR2(4000) ;
259 
260   l_msg_header     xnp_message.msg_header_rec_type ;
261 
262   -- Change to CLOB
263 
264   l_msg_text       VARCHAR2(32767) ;
265   l_operation      VARCHAR2(4000) := NULL ;
266   l_description    VARCHAR2(4000) := NULL ;
267   l_fnd_message    VARCHAR2(4000) := NULL ;
268   l_in_tmr_q       NUMBER ;
269   l_next_timer	   VARCHAR2(20);
270 
271   invalid_dummy_timer		EXCEPTION;
272   failed_to_move_message	EXCEPTION;
273   timer_start_failed		EXCEPTION;
274   failed_to_update_status	EXCEPTION;
275 
276 BEGIN
277 
278 	l_error_code := 0 ;
279 	l_error_message := NULL ;
280 
281 	/*  dequeue a message from the AQ */
282 
283 	SAVEPOINT	dequeue_timer ;
284 
285 	xnp_message.pop (p_queue_name => p_queue_name,
286 			x_msg_header => l_msg_header,
287 			x_body_text => l_msg_text,
288 			x_error_code => l_error_code,
289 			x_error_message => l_error_message,
290 			p_correlation_id => process.p_correlation_id ) ;
291 
292 	/*  check if the pop timed out */
293 
294 	IF ( l_error_code = xnp_errors.g_dequeue_timeout ) THEN
295                 x_queue_timed_out := 'Y';
296 		COMMIT ;
297 		RETURN ;
298 	END IF ;
299 
300 /*  check if it is a control message to stop the timer server */
301 
302 	IF (l_msg_header.message_code  = 'T_DUMMY')
303 	THEN
304 
305 	/* update dummy timer status to EXPIRED */
306 
307 	xnp_timer_core.update_timer_status(
308 			p_timer_id => l_msg_header.message_id,
309 			p_status => 'EXPIRED',
310 			x_error_code => l_error_code,
311 			x_error_message => l_error_message);
312 
313 	IF (l_error_code <> 0) THEN
314 		RAISE failed_to_update_status;
315 	END IF ;
316 
317 	/*
318 	** Get the actual message from the timer registry
319 	** Next_Timer column for the timer_id
320 	*/
321 		l_next_timer := xnp_timer_core.get_next_timer
322 					(l_msg_header.message_id);
323 
324 		IF (l_next_timer IS NULL)
325 		THEN
326 			RAISE invalid_dummy_timer;
327 		END IF;
328 
329 		/* Start Actual Timer */
330 
331     		start_actual_timer(l_next_timer,
332 				l_msg_header,
333 				l_msg_text,
334 				l_error_code,
335 				l_error_message);
336 
337 		/* check for error code/message */
338 
339 		IF (l_error_code <> 0) THEN
340 			RAISE timer_start_failed ;
341 		END IF;
342 
343 	ELSE
344 		/* update dummy timer status to EXPIRED */
345 
346 		xnp_timer_core.update_timer_status(
347 			p_timer_id => l_msg_header.message_id,
348 			p_status => 'EXPIRED',
349 			x_error_code => l_error_code,
350 			x_error_message => l_error_message);
351 
352 
353 		IF (l_error_code = 0) THEN
354 
355 			move_to_inbound(l_msg_header,
356 				l_msg_text,
357 				l_error_code,
358 				l_error_message);
359 
360 			IF (l_error_code <> 0) THEN
361 				RAISE failed_to_move_message ;
362 			END IF;
363 		ELSE
364 			RAISE failed_to_update_status;
365 
366 		END IF ;
367 
368 	END IF;
369 
370 	COMMIT ;
371 
372 	EXCEPTION
373 
374     	WHEN invalid_dummy_timer THEN
375 
376 		ROLLBACK TO dequeue_timer ;
377 
378          	fnd_message.set_name ('XNP', 'INVALID_DUMMY_TIMER') ;
379 
380          	fnd_message.set_token ('DUMMY_TIMER_ID',
381 				l_msg_header.message_id) ;
382 
383          	l_fnd_message:= FND_MESSAGE.get ;
384 
385 		xnp_message.update_status(l_msg_header.message_id,
386 				'FAILED',
387 				l_fnd_message) ;
388 
389     	WHEN timer_start_failed THEN
390 
391 		ROLLBACK TO dequeue_timer ;
392 
393          	fnd_message.set_name ('XNP', 'START_TIMER_FAILED') ;
394 
395 
396          	fnd_message.set_token ('ACTUAL_TIMER_CODE',
397 				l_next_timer) ;
398 
399          	fnd_message.set_token ('ERROR_CODE',
400 				l_error_code) ;
401 
402          	fnd_message.set_token ('ERROR_MESSAGE',
403 				l_error_message) ;
404 
405          	l_fnd_message:= FND_MESSAGE.get ;
406 
407 		xnp_message.update_status(l_msg_header.message_id,
408 				'FAILED',
409 				l_fnd_message) ;
410 
411     	WHEN failed_to_move_message THEN
412 
413 		ROLLBACK TO dequeue_timer ;
414 
415          	fnd_message.set_name ('XNP', 'TIMER_MOVE_FAILED') ;
416 
417          	fnd_message.set_token ('TIMER_ID',
418 				l_msg_header.message_id) ;
419 
420          	fnd_message.set_token ('ERROR_CODE',
421 				l_error_code) ;
422 
423          	fnd_message.set_token ('ERROR_MESSAGE',
424 				l_error_message) ;
425 
426          	l_fnd_message:= FND_MESSAGE.get ;
427 
428 		xnp_message.update_status(l_msg_header.message_id,
429 				'FAILED',
430 				l_fnd_message) ;
431 
432 	/* failed to update timer status in registry */
433 
434     	WHEN failed_to_update_status THEN
435 
436 		ROLLBACK TO dequeue_timer ;
437 
438          	fnd_message.set_name ('XNP', 'UPDATE_TIMER_STATUS_FAILED') ;
439 
440          	fnd_message.set_token ('TIMER_ID',
441 				l_msg_header.message_id) ;
442 
443          	fnd_message.set_token ('ERROR_CODE',
444 				l_error_code) ;
445 
446          	fnd_message.set_token ('ERROR_MESSAGE',
447 				l_error_message) ;
448 
449          	l_fnd_message:= FND_MESSAGE.get ;
450 
451 		xnp_message.update_status(l_msg_header.message_id,
452 				'FAILED',
453 				l_fnd_message) ;
454 END process;
455 
456 
457 /***********************************************************************
458 *****	Procedure:	START_ACTUAL_TIMER()
459 *****	Purpose:	Starts the actual timer for a dummy.
460 ***********************************************************************/
461 
462 PROCEDURE start_actual_timer( p_timer_code IN VARCHAR2,
463 		p_dummy_header IN xnp_message.msg_header_rec_type,
464 		p_dummy_text IN VARCHAR2,
465 		x_error_code OUT NOCOPY NUMBER,
466 		x_error_message OUT NOCOPY VARCHAR2)
467 
468 IS
469 
470 	l_msg_text	VARCHAR2(32767);
471 	v_msg_header	xnp_message.msg_header_rec_type ;
472 
473 	l_actual_interval_text	VARCHAR2(80) ;
474 	l_payload VARCHAR2(16000);
475 	l_actual_interval	NUMBER ;
476 	l_delay NUMBER := 0 ;
477 	l_num_rows NUMBER ;
478 
479 
480 BEGIN
481 
482 
483 	/* get the interval for the actual timer */
484 
485 	xnp_xml_utils.decode(p_dummy_text,'PAYLOAD',l_payload);
486 
487 	xnp_xml_utils.decode(l_payload,'INTERVAL',l_actual_interval_text);
488 
489 	l_actual_interval := TO_NUMBER(l_actual_interval_text) ;
490 
491 	/* construct the actual timer */
492 
493 	construct_dynamic_message(p_msg_to_create => p_timer_code,
494 				p_old_msg_header => p_dummy_header,
495 				p_delay => 0,
496 				p_interval => l_actual_interval,
497 				x_new_msg_header => v_msg_header,
498 				x_new_msg_text => l_msg_text,
499 				x_error_code => x_error_code,
500 				x_error_message => x_error_message) ;
501 
502 
503 	IF ( x_error_code = 0) THEN
504 
505 	/* start the timer */
506 
507 		xnp_timer.start_timer(v_msg_header,
508 				l_msg_text,
509 				x_error_code,
510 				x_error_message) ;
511 
512 	END IF ;
513 
514 
515 EXCEPTION
516 	WHEN OTHERS THEN
517 		x_error_code := SQLCODE;
518 		x_error_message := SQLERRM ;
519 
520 END START_ACTUAL_TIMER ;
521 
522 /**********************************************************************
523 *****  Procedure:    MOVE_TO_INBOUND()
524 *****  Purpose:      Moves a message to inbound queue.
525 ***********************************************************************/
526 
527 PROCEDURE move_to_inbound(
528 		p_msg_header IN xnp_message.msg_header_rec_type,
529 		p_msg_text IN VARCHAR2,
530 		x_error_code OUT NOCOPY NUMBER,
531 		x_error_message OUT NOCOPY VARCHAR2)
532 
533 IS
534 	l_message            system.xnp_message_type ;
535 	l_msg_id             XNP_MSGS.MSG_ID%TYPE ;
536 	my_enqueue_options   dbms_aq.enqueue_options_t ;
537 	message_properties   dbms_aq.message_properties_t ;
538 	message_handle       RAW(16) ;
539 
540 
541 	l_feedback           VARCHAR2(4000) := NULL ;
542 
543 BEGIN
544 
545 	message_properties.priority := 3 ;
546 	message_properties.correlation := 'MSG_SERVER' ;
547 
548 -- adabholk 03/2001
549 -- Perfomance Changes
550 -- Changed incorrect enqueue option at the time of performance changes
551 
552 --	my_enqueue_options.visibility := DBMS_AQ.IMMEDIATE ;
553 	my_enqueue_options.visibility := DBMS_AQ.ON_COMMIT ;
554 
555 	l_message := system.xnp_message_type(p_msg_header.message_id) ;
556 
557 	DBMS_AQ.ENQUEUE (
558 			queue_name => xnp_event.c_inbound_msg_q ,
559 			enqueue_options => my_enqueue_options,
560 			message_properties => message_properties,
561 			payload => l_message,
562 			msgid => message_handle ) ;
563 
564 END move_to_inbound ;
565 
566 
567 /*****************************************************************************/
568 
569 PROCEDURE construct_dynamic_message(
570 			p_msg_to_create  IN VARCHAR2,
571 			p_old_msg_header IN xnp_message.msg_header_rec_type,
572 			p_delay IN NUMBER DEFAULT NULL,
573 			p_interval IN NUMBER DEFAULT NULL,
574 			x_new_msg_header OUT NOCOPY xnp_message.msg_header_rec_type,
575 			x_new_msg_text OUT NOCOPY VARCHAR2,
576 			x_error_code OUT NOCOPY NUMBER,
577 			x_error_message OUT NOCOPY VARCHAR2)
578 
579 IS
580 
581 	l_sql_block VARCHAR2(32767) ;
582 	l_num_rows  NUMBER;
583 
584 BEGIN
585 
586 
587 	l_sql_block :=
588 		'
589 	BEGIN
590 		DECLARE
591 		l_msg_header  XNP_MESSAGE.MSG_HEADER_REC_TYPE ;
592 		BEGIN
593 		' || g_new_line ;
594 
595 
596 		l_sql_block := l_sql_block || g_new_line ||
597 			p_msg_to_create ||
598 				'.CREATE_MSG(l_msg_header,
599    		 			:l_msg_text,
600 					:error_code,
601 					:error_message,
602 					:l_sender_name,
603 					:l_recipient_list,
604 					:l_version,
605 					:l_reference_id,
606 					:l_opp_reference_id,
607 					:l_order_id,
608 					:l_wi_instance_id,
609 					:l_fa_instance_id
610 				' || g_new_line ;
611 
612 		IF (p_delay IS NOT NULL) THEN
613 
614 
615 			l_sql_block := l_sql_block ||
616 			'
617 			,:delay
618 
619 			' || g_new_line ;
620 
621 		END IF ;
622 
623 		IF (p_interval IS NOT NULL) THEN
624 			l_sql_block := l_sql_block ||
625 			'
626 			,:interval
627 
628 			' || g_new_line ;
629 
630 		END IF ;
631 
632 		l_sql_block := l_sql_block ||
633 		'
634 		);
635 		:message_id := l_msg_header.message_id;
636 		:message_code := l_msg_header.message_code;
637 		:reference_id := l_msg_header.reference_id;
638 		:opp_ref_id := l_msg_header.opp_reference_id;
639 		:creation_date := l_msg_header.creation_date;
640 		:sender_name := l_msg_header.sender_name;
641 		:recipient_name := l_msg_header.recipient_name;
642 		:version := l_msg_header.version;
643 		:direction_indr := l_msg_header.direction_indr;
644 		:order_id := l_msg_header.order_id;
645 		:wi_instance_id := l_msg_header.wi_instance_id;
646 		:fa_instance_id := l_msg_header.fa_instance_id;
647 		END ;
648 	END ;
649 
650 	' || g_new_line ; /* end dynamic sql block */
651 
652 
653 	IF (p_delay IS NULL AND p_interval IS NULL)
654 	THEN
655 		EXECUTE IMMEDIATE l_sql_block USING
656 			 OUT x_new_msg_text
657 			,OUT x_error_code
658 			,OUT x_error_message
659 			,p_old_msg_header.sender_name
660 			,p_old_msg_header.recipient_name
661 			,p_old_msg_header.version
662 			,p_old_msg_header.reference_id
663 			,p_old_msg_header.opp_reference_id
664 			,p_old_msg_header.order_id
665 			,p_old_msg_header.wi_instance_id
666 			,p_old_msg_header.fa_instance_id
667 			,OUT x_new_msg_header.message_id
668 			,OUT x_new_msg_header.message_code
669 			,OUT x_new_msg_header.reference_id
670 			,OUT x_new_msg_header.opp_reference_id
671 			,OUT x_new_msg_header.creation_date
672 			,OUT x_new_msg_header.sender_name
673 			,OUT x_new_msg_header.recipient_name
674 			,OUT x_new_msg_header.version
675 			,OUT x_new_msg_header.direction_indr
676 			,OUT x_new_msg_header.order_id
677 			,OUT x_new_msg_header.wi_instance_id
678 			,OUT x_new_msg_header.fa_instance_id;
679 
680 	ELSIF (p_delay IS NOT NULL AND p_interval IS NULL)
681 	THEN
682 		EXECUTE IMMEDIATE l_sql_block USING
683 			 OUT x_new_msg_text
684 			,OUT x_error_code
685 			,OUT x_error_message
686 			,p_old_msg_header.sender_name
687 			,p_old_msg_header.recipient_name
688 			,p_old_msg_header.version
689 			,p_old_msg_header.reference_id
690 			,p_old_msg_header.opp_reference_id
691 			,p_old_msg_header.order_id
692 			,p_old_msg_header.wi_instance_id
693 			,p_old_msg_header.fa_instance_id
694 			,p_delay
695 			,OUT x_new_msg_header.message_id
696 			,OUT x_new_msg_header.message_code
697 			,OUT x_new_msg_header.reference_id
698 			,OUT x_new_msg_header.opp_reference_id
699 			,OUT x_new_msg_header.creation_date
700 			,OUT x_new_msg_header.sender_name
701 			,OUT x_new_msg_header.recipient_name
702 			,OUT x_new_msg_header.version
703 			,OUT x_new_msg_header.direction_indr
704 			,OUT x_new_msg_header.order_id
705 			,OUT x_new_msg_header.wi_instance_id
706 			,OUT x_new_msg_header.fa_instance_id;
707 
708 	ELSIF (p_delay IS NULL and p_interval IS NOT NULL)
709 	THEN
710 		EXECUTE IMMEDIATE l_sql_block USING
711 			 OUT x_new_msg_text
712 			,OUT x_error_code
713 			,OUT x_error_message
714 			,p_old_msg_header.sender_name
715 			,p_old_msg_header.recipient_name
716 			,p_old_msg_header.version
717 			,p_old_msg_header.reference_id
718 			,p_old_msg_header.opp_reference_id
719 			,p_old_msg_header.order_id
720 			,p_old_msg_header.wi_instance_id
721 			,p_old_msg_header.fa_instance_id
722 			,p_interval
723 			,OUT x_new_msg_header.message_id
724 			,OUT x_new_msg_header.message_code
725 			,OUT x_new_msg_header.reference_id
726 			,OUT x_new_msg_header.opp_reference_id
727 			,OUT x_new_msg_header.creation_date
728 			,OUT x_new_msg_header.sender_name
729 			,OUT x_new_msg_header.recipient_name
730 			,OUT x_new_msg_header.version
731 			,OUT x_new_msg_header.direction_indr
732 			,OUT x_new_msg_header.order_id
733 			,OUT x_new_msg_header.wi_instance_id
734 			,OUT x_new_msg_header.fa_instance_id;
735 	ELSE
736 
737 
738 		EXECUTE IMMEDIATE l_sql_block USING
739 			 OUT x_new_msg_text
740 			,OUT x_error_code
741 			,OUT x_error_message
742 			,p_old_msg_header.sender_name
743 			,p_old_msg_header.recipient_name
744 			,p_old_msg_header.version
745 			,p_old_msg_header.reference_id
746 			,p_old_msg_header.opp_reference_id
747 			,p_old_msg_header.order_id
748 			,p_old_msg_header.wi_instance_id
749 			,p_old_msg_header.fa_instance_id
750 			,p_delay
751 			,p_interval
752 			,OUT x_new_msg_header.message_id
753 			,OUT x_new_msg_header.message_code
754 			,OUT x_new_msg_header.reference_id
755 			,OUT x_new_msg_header.opp_reference_id
756 			,OUT x_new_msg_header.creation_date
757 			,OUT x_new_msg_header.sender_name
758 			,OUT x_new_msg_header.recipient_name
759 			,OUT x_new_msg_header.version
760 			,OUT x_new_msg_header.direction_indr
761 			,OUT x_new_msg_header.order_id
762 			,OUT x_new_msg_header.wi_instance_id
763 			,OUT x_new_msg_header.fa_instance_id;
764 
765 	END IF;
766 
767 EXCEPTION
768 	WHEN OTHERS THEN
769 		x_error_code := SQLCODE;
770 		x_error_message := SQLERRM ;
771 
772 END construct_dynamic_message;
773 
774 /***********************************************************************
775 *****	Procedure:	PROCESS_IN_TMR()
776 *****	Purpose:	Wrapper procedure for inbound Timer dequer
777 ***********************************************************************/
778 PROCEDURE PROCESS_IN_TMR
779 IS
780 	l_in_tmr_q_state VARCHAR2(1024) ;
781 BEGIN
782 
783 	LOOP
784 
785 		l_in_tmr_q_state := xdp_aq_utilities.get_queue_state
786 				(xnp_event.cc_timer_q) ;
787 
788 		IF ((l_in_tmr_q_state = 'SHUTDOWN') OR
789 			(l_in_tmr_q_state = 'DISABLED'))
790 		THEN
791 			RETURN ;
792     		END IF ;
793 
794 		process (xnp_event.c_timer_q);
795 
796 	END LOOP;
797 
798 END PROCESS_IN_TMR;
799 
800 PROCEDURE  process_in_tmr (p_message_wait_timeout IN NUMBER DEFAULT 1,
801 			p_correlation_id IN VARCHAR2,
802 			x_message_key OUT NOCOPY VARCHAR2,
803 			x_queue_timed_out OUT NOCOPY VARCHAR2 )
804 IS
805 BEGIN
806 
807 	process (xnp_event.c_timer_q, p_correlation_id, x_queue_timed_out) ;
808 
809 END process_in_tmr ;
810 
811 END XNP_TIMER_MGR;