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