[Home] [Help]
PACKAGE BODY: APPS.XNP_TIMER
Source
1 PACKAGE BODY xnp_timer AS
2 /* $Header: XNPTIMRB.pls 120.2 2006/02/13 07:57:10 dputhiye ship $ */
3
4 /* forward declarations */
5 PROCEDURE add_timer (
6 p_msg_header IN xnp_message.msg_header_rec_type,
7 p_msg_text IN VARCHAR2,
8 p_dummy_for IN VARCHAR2 DEFAULT NULL,
9 x_error_code OUT NOCOPY NUMBER,
10 x_error_message OUT NOCOPY VARCHAR2 ) ;
11
12 /* end forward declarations */
13
14 --------------------------------------------------------------------------
15 ---- PROCEDURE: start_timer()
16 ---- PURPOSE: Checks the delay and the interval, if delay is greater
17 ---- than zero, introduces a dummy timer into the system.
18 ---- Otherwise enqueues the actual timer.
19 --------------------------------------------------------------------------
20 PROCEDURE start_timer (
21
22 p_msg_header IN xnp_message.msg_header_rec_type
23 ,p_msg_text IN VARCHAR2
24 ,x_error_code OUT NOCOPY NUMBER
25 ,x_error_message OUT NOCOPY VARCHAR2
26
27 )
28 IS
29
30 l_delay NUMBER := 0 ;
31 l_interval NUMBER := 0 ;
32
33 l_temp VARCHAR2(1024) ;
34 l_msg_header xnp_message.msg_header_rec_type;
35 l_msg_text VARCHAR2(32767) ;
36
37 l_payload varchar2(32767) ;
38
39 BEGIN
40 x_error_code := 0;
41 x_error_message := NULL;
42
43
44 xnp_xml_utils.decode(p_msg_text,'DELAY',l_temp) ;
45 l_delay := TO_NUMBER(l_temp) ;
46
47 xnp_xml_utils.decode(p_msg_text,'INTERVAL',l_temp) ;
48 l_interval := TO_NUMBER(l_temp) ;
49
50
51 IF (l_delay <= 0) THEN
52
53 add_timer(p_msg_header => p_msg_header,
54 p_msg_text => p_msg_text,
55 x_error_code => x_error_code,
56 x_error_message => x_error_message);
57 ELSE
58 xnp_xml_utils.decode(p_msg_text,
59 p_msg_header.message_code,
60 l_payload) ;
61
62 xnp_t_dummy_u.create_msg(x_msg_header => l_msg_header,
63 x_msg_text => l_msg_text,
64 x_error_code => x_error_code,
65 x_error_message => x_error_message,
66 p_sender_name => p_msg_header.sender_name,
67 p_recipient_list => p_msg_header.recipient_name,
68 p_version => p_msg_header.version,
69 p_reference_id => p_msg_header.reference_id,
70 p_opp_reference_id => p_msg_header.opp_reference_id,
71 p_order_id => p_msg_header.order_id,
72 p_wi_instance_id => p_msg_header.wi_instance_id,
73 p_fa_instance_id => p_msg_header.fa_instance_id,
74 p_delay => 0,
75 p_interval => l_delay,
76 xnp$payload => l_payload);
77
78 IF (x_error_code = 0) THEN
79
80 add_timer(p_msg_header => l_msg_header,
81 p_msg_text => l_msg_text,
82 p_dummy_for => p_msg_header.message_code,
83 x_error_code => x_error_code,
84 x_error_message => x_error_message);
85
86 END IF ;
87
88 END IF ;
89
90 END start_timer;
91
92 ---------------------------------------------------------------------
93 -- Purpose: Bug # 1351421
94 -- Get the timer_id for the ACTIVE timer with
95 -- same reference_id and timer_message_code.
96 -- checks both for DUMMY and the actual timer
97 -- and wrt both DUMMY and actual timer.
98 -- Caller: add_to_registry
99 ----------------------------------------------------------------------
100
101 PROCEDURE get_active_timer(
102 p_msg_header IN xnp_message.msg_header_rec_type,
103 p_dummy_for IN VARCHAR2,
104 p_timer_id OUT NOCOPY NUMBER,
105 x_error_code OUT NOCOPY NUMBER,
106 x_error_message OUT NOCOPY VARCHAR2)
107 IS
108 CURSOR c_timer_reg(p_message_code IN VARCHAR2) IS
109 SELECT timer_id,timer_message_code,next_timer
110 FROM xnp_timer_registry
111 WHERE
112 reference_id=p_msg_header.reference_id
113 AND
114 (
115 timer_message_code = p_message_code
116 OR
117 next_timer= p_message_code
118 )
119 AND status = 'ACTIVE';
120
121 l_msg_code VARCHAR2(20); -- AS PER XNP_TIMER_REGISTRY.TIMER_MESSAGE_CODE
122 BEGIN
123 x_error_code := 0;
124 IF p_dummy_for IS NULL THEN
125 l_msg_code := p_msg_header.message_code;
126 ELSE
127 l_msg_code := p_dummy_for;
128 END IF;
129
130 FOR rec in c_timer_reg(l_msg_code)
131 LOOP
132 p_timer_id := rec.timer_id;
133 EXIT;
134 END LOOP;
135 EXCEPTION
136 WHEN OTHERS THEN
137 x_error_code := SQLCODE;
138 x_error_message := SQLERRM;
139 END;
140
141 -------------------------------------------------------------------------
142 ---- PROCEDURE: add_timer()
143 ---- PURPOSE: Adds the timer to the queue and to the registry.
144 -------------------------------------------------------------------------
145 PROCEDURE add_timer (
146 p_msg_header IN xnp_message.msg_header_rec_type,
147 p_msg_text IN VARCHAR2,
148 p_dummy_for IN VARCHAR2 DEFAULT NULL,
149 x_error_code OUT NOCOPY NUMBER,
150 x_error_message OUT NOCOPY VARCHAR2 )
151
152 IS
153
154 l_interval NUMBER ;
155 l_interval_txt VARCHAR2(1024) ;
156 l_dummy_text VARCHAR2(32767) ;
157
158 l_status VARCHAR2(1024) ;
159 l_timer_id NUMBER ;
160
161 l_start_time DATE ;
162 l_end_time DATE ;
163
164 BEGIN
165
166 -- Bug # 1351421
167 -- Check if there is a ACTIVE timer already fired for
168 -- same reference_id and message_code
169 -- If so remove that timer.
170 -- Note that add_timer is called both for dummy as well
171 -- as the actual timer. For each case need to take care
172 -- of earlier DUMMY or actual timers.
173
174
175 get_active_timer(
176 p_msg_header => p_msg_header,
177 p_dummy_for => p_dummy_for,
178 p_timer_id => l_timer_id,
179 x_error_code => x_error_code,
180 x_error_message => x_error_message);
181
182 IF (x_error_code <> 0) THEN
183 return;
184 ELSE
185 IF l_timer_id IS NOT NULL THEN
186 xnp_timer_core.remove_timer(
187 p_timer_id => l_timer_id,
188 x_error_code => x_error_code,
189 x_error_message => x_error_message) ;
190
191 IF (x_error_code <> 0) THEN
192 RETURN ;
193 END IF ;
194 END IF;
195 END IF;
196
197 IF (p_msg_header.message_code = 'T_DUMMY') THEN
198
199 xnp_xml_utils.decode(p_msg_text,'T_DUMMY',l_dummy_text);
200
201 xnp_xml_utils.decode(l_dummy_text, 'INTERVAL',
202 l_interval_txt) ;
203 ELSE
204
205 xnp_xml_utils.decode(p_msg_text, 'INTERVAL', l_interval_txt) ;
206
207 END IF ;
208
209 l_interval := TO_NUMBER(l_interval_txt) ;
210
211 xnp_message.push(p_msg_header => p_msg_header,
212 p_body_text => p_msg_text,
213 p_queue_name => xnp_event.c_timer_q,
214 p_priority => 1,
215 p_delay => l_interval,
216 p_commit_mode => xnp_message.c_on_commit) ;
217
218
219 l_start_time := SYSDATE ;
220 l_end_time := l_start_time + (l_interval/86400) ; --24*3600 replaced by 86400
221
222 INSERT INTO xnp_timer_registry (
223 timer_id,
224 reference_id,
225 timer_message_code,
226 status,
227 start_time,
228 end_time,
229 next_timer,
230 order_id,
231 wi_instance_id,
232 fa_instance_id,
233 created_by,
234 creation_date,
235 last_updated_by,
236 last_update_date
237 )
238 VALUES (
239 p_msg_header.message_id,
240 p_msg_header.reference_id,
241 p_msg_header.message_code,
242 'ACTIVE',
243 l_start_time,
244 l_end_time,
245 p_dummy_for,
246 p_msg_header.order_id,
247 p_msg_header.wi_instance_id,
248 p_msg_header.fa_instance_id,
249 fnd_global.user_id,
250 sysdate,
251 fnd_global.user_id,
252 sysdate
253 );
254
255 EXCEPTION
256 WHEN OTHERS THEN
257 x_error_code := SQLCODE ;
258 x_error_message := SQLERRM ;
259
260 END add_timer ;
261
262
263 END xnp_timer;