/[cvs]/nfo/perl/libs/POE/Component/LookupClient.pm
ViewVC logotype

Contents of /nfo/perl/libs/POE/Component/LookupClient.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations)
Tue Jul 1 13:05:01 2003 UTC (21 years ago) by joko
Branch: MAIN
Changes since 1.1: +191 -19 lines
major changes, tried to clean up shutdown phase - the watchdog-mech didn't work out well..... - what's about IKC's monitor? does it work on Linux?

1 ## ------------------------------------------------------------------------
2 ## $Id: LookupClient.pm,v 1.1 2003/06/29 01:35:29 joko Exp $
3 ## ------------------------------------------------------------------------
4 ## $Log: LookupClient.pm,v $
5 ## Revision 1.1 2003/06/29 01:35:29 joko
6 ## initial commit
7 ##
8 ## ------------------------------------------------------------------------
9
10
11 package POE::Component::LookupClient;
12
13 use strict;
14 use warnings;
15
16 use POE qw( Session Component::IKC::Client );
17 use Data::Dumper;
18
19
20 sub new {
21 my $classname = shift;
22 my @args = @_;
23
24 my $self = {};
25 bless $self, $classname;
26
27 $self->{options} = { @args };
28
29 #my $event_handler = lookupd->new();
30 POE::Session->create(
31 object_states => [
32 $self => [qw( _start _stop boot_intercom start_session waste_time watchdog )]
33 ]
34 );
35
36 }
37
38 # This is not a POE method. It's a plain OO one.
39 sub debug {
40 my $self = shift;
41 my $msg = shift;
42 $msg ||= '';
43 print STDERR __PACKAGE__ . ": " . $msg, "\n";
44 }
45
46 # Controller's event handlers
47
48 sub _start {
49 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
50 $self->debug("_start");
51
52 #$kernel->alias_set("controller");
53
54 #$kernel->post( controller => 'start_daemon' );
55 #$kernel->yield( 'boot_storage' );
56 $kernel->yield( 'boot_intercom' );
57 #$_[HEAP]->{subsession} = POE::Session->create( inline_states => { _start => sub { print "WORKER!", "\n"; } } );
58 #$_[HEAP]->{subsession}->yield(
59
60 };
61
62 sub _stop {
63 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
64 $self->debug("_stop");
65 };
66
67 sub boot_intercom {
68
69 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
70 $self->debug("boot_intercom");
71
72 # Client component - encapsulates some session(s) and/or wheel(s)?
73
74 my $host = "localhost";
75 #create_ikc_client( host => $host, port => 30, name => 'Client', on_connect => $self->{options}->{on_connect} );
76 create_ikc_client(
77 host => $host,
78 port => 30,
79 #name => 'Client',
80 #on_connect => sub { $self->build(); },
81 on_connect => sub { $self->build(); },
82 #subscribe => [qw( poe://LookupService/ServiceRegistrar )],
83 #subscribe => [qw( poe://LookupService/ServiceRegistrar )],
84 );
85
86 #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' });
87 #$kernel->post( IKC => 'monitor', 'LookupService' => { register => 'start_session' });
88 #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' );
89
90 # start up the watchdog which monitors the required IKC intercom session
91 #$kernel->yield('waste_time');
92 #$kernel->delay('watchdog', 2);
93
94 };
95
96 sub start_session {
97 #my $self = shift;
98 print STDERR "start_session", "\n";
99 }
100
101 sub build {
102 my $self = shift;
103 print "build", "\n";
104 # create sessions that depend on the foreign kernel.
105 POE::Component::LookupClient::Session->new();
106 }
107
108 sub watchdog {
109 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
110 $self->debug("watchdog");
111
112 #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' });
113
114 #if (not defined $kernel->alias_resolve('DeviceClient')) {
115 if (not defined $kernel->alias_resolve('IKC')) {
116 print STDERR "Session died, trying to restart!", "\n";
117 #$kernel->yield('boot_intercom');
118 return;
119 }
120
121 $kernel->delay('watchdog', 2);
122 };
123
124 #------------------------------------------------------------------------------
125 # This event keeps this POE kernel alive.
126 # (stolen from POE::Component::IKC::Server, but not used 'til now...)
127 sub waste_time {
128 my($kernel, $heap)=@_[KERNEL, HEAP];
129 return if $heap->{'is a child'};
130
131 unless($heap->{'been told we are parent'}) {
132 warn "$$: Telling everyone we are the parent\n";
133 $heap->{'been told we are parent'}=1;
134 $kernel->signal($kernel, '__parent');
135 }
136 if($heap->{'die'}) {
137 #DEBUG and warn "$$: Orderly shutdown\n";
138 } else {
139 $kernel->yield('watchdog');
140 $kernel->delay('waste_time', 60);
141 }
142 return;
143 }
144
145
146
147
148 package POE::Component::LookupClient::Session;
149
150 use strict;
151 use warnings;
152
153 use POE qw( Session );
154 use Data::Dumper;
155
156
157 sub new {
158 my $classname = shift;
159 my @args = @_;
160
161 my $self = {};
162 bless $self, $classname;
163
164 $self->{options} = { @args };
165
166 POE::Session->create(
167 object_states => [
168 $self => [qw( _start _stop on_response on_subscribe register_lease renew_lease remote_shutdown remote_timeout )]
169 ]
170 );
171
172 }
173
174
175 # This is not a POE method. It's a plain OO one.
176 sub debug {
177 my $self = shift;
178 my $msg = shift;
179 $msg ||= '';
180 print STDERR __PACKAGE__ . ": " . $msg, "\n";
181 }
182
183 # Controller's event handlers
184
185 sub _start {
186 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
187 $self->debug("_start");
188
189 #$kernel->alias_set('');
190 #$kernel->post();
191
192 # set up communication channel for asynchronous responses
193 $kernel->alias_set('DeviceClient');
194 $kernel->post('IKC', 'publish', 'DeviceClient', [qw( on_response )]);
195
196 #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' );
197
198 $kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'on_subscribe' );
199
200 # try to register on startup?
201 #$kernel->yield('register_lease');
202
203 };
204
205 sub _stop {
206 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
207 $self->debug("_stop");
208
209 # try to re-register if session dies?
210 #$kernel->yield('register_lease');
211
212 #$kernel->alias_remove('DeviceClient');
213
214 #$self = undef;
215 };
216
217
218 # Subscription receipt callback, see "perldoc POE::Component::IKC::Responder".
219 sub on_subscribe {
220 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
221 $self->debug("on_subscribe");
222 # register lease on subscription
223 $kernel->yield('register_lease');
224 }
225
226 # Main response dispatcher, this should dispatch to local states programmatically.
227 sub on_response {
228 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
229 #$self->debug("response");
230
231 $heap->{'cancel timeout'} = 1;
232
233 my $payload = $_[ARG0];
234 $payload ||= '';
235
236 # If registration succeeded, start the renewal cycle.
237 if ($payload eq 'REG_OK') {
238 $self->debug("Starting lease renewal loop.");
239 #$kernel->post( IKC => 'monitor', '*' => { shutdown => 'remote_shutdown' });
240 $kernel->yield( 'renew_lease' );
241
242 } elsif ($payload eq 'LEASE_OK') {
243 $self->debug("Received 'LEASE_OK'.");
244 #$kernel->yield( 'renew_lease' );
245
246 # 1. otherwise dump anything sent to us for debugging purposes
247 # 2. destroy lease in any case on unknown payload
248 } else {
249 #print Dumper($payload);
250 $heap->{'destroy lease'} = 1;
251 #$kernel->alarm_remove_all();
252
253 }
254
255 };
256
257 sub register_lease {
258 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
259 $self->debug("register_lease");
260
261 my $ONE_arg = "Hello World!";
262
263 # V1 - without subscription
264 #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/register_lease", $ONE_arg);
265 # V2 - with subscription
266 $kernel->post( "poe://LookupService/ServiceRegistrar", "register_lease", $ONE_arg );
267 }
268
269 sub renew_lease {
270 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
271
272 if ($heap->{'destroy lease'}) {
273 #$heap->{'destroy lease'} = 0;
274 #$kernel->delay_set('remote_timeout');
275 $self->debug("destroyed lease");
276 #undef $self;
277 #$kernel->alias_remove('DeviceClient');
278 #undef $_[SESSION];
279 #$kernel->post( 'IKC' => 'shutdown' );
280 # clear delayed posts
281 #$kernel->delay('renew_lease');
282 #$kernel->delay('remote_timeout');
283 return;
284 }
285
286 $self->debug("renew_lease");
287
288 # check if remote kernel(s) are still around
289 #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', '', 'poe:remote_timeout');
290 #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', undef, 'poe:remote_timeout');
291 #$kernel->post('poe://remote/IKC', 'ping', 'poe:remote_timeout');
292 #$kernel->delay('remote_timeout', 5); # timeout
293
294 my $ONE_arg = '';
295 #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg);
296 # V1 - without subscription
297 $kernel->post('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:on_response');
298
299 # V2 - with subscription
300 #my $resp = $kernel->call( "poe://LookupService/ServiceRegistrar", "renew_lease", $ONE_arg);
301 #print $resp, "\n";
302
303 # V3 - have we been able to post?
304 #my $resp = $kernel->call('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:response');
305 #print "resp: $resp", "\n";
306
307 # and again...
308 $kernel->delay('renew_lease', 15);
309 #$kernel->delay_set('renew_lease', 15);
310 #$kernel->delay_add('renew_lease', 15);
311
312 # timeout!?
313 #$kernel->delay('remote_timeout', 20);
314 $kernel->delay_add('remote_timeout', 20);
315 #$kernel->delay_set('remote_timeout', 5);
316 #$kernel->delay_set('remote_timeout', 20);
317
318 }
319
320 sub remote_shutdown {
321 my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
322 $self->debug("remote_shutdown");
323 }
324
325 sub remote_timeout {
326
327 #my ($pong) = $_[ARG0];
328 #return if $pong; # all is cool
329
330 my ($self, $kernel, $heap) = @_[OBJECT, KERNEL, HEAP];
331
332 #=pod
333 if ($heap->{'cancel timeout'}) {
334 $heap->{'cancel timeout'} = 0;
335 return;
336 }
337 #=cut
338
339 $self->debug("remote_timeout");
340
341 $heap->{'destroy lease'} = 1;
342
343 # YOW! Remote kernel timed out. RUN AROUND SCREAMING!
344 print STDERR "# YOW! Remote kernel timed out. RUN AROUND SCREAMING!", "\n";
345
346 # free all resources that keep this session running
347 $kernel->delay('renew_lease');
348 $kernel->delay('remote_timeout');
349
350 #$kernel->post( 'IKC' => 'shutdown' );
351
352 #$kernel->alias_remove('DeviceClient');
353
354 #$kernel->alias_remove('DeviceClient');
355 #$kernel->yield('renew_lease');
356
357 #sub POE::Component::IKC::Responder::DEBUG { return 1; }
358 #$kernel->post( 'IKC' => 'unregister' );
359
360 #print Dumper($kernel->alias_list());
361
362 $kernel->post( IKC => 'retract', 'DeviceClient' => [qw( on_response )]);
363 #$kernel->post( IKC => 'retract', 'me' => [qw( on_response )]);
364 $kernel->post( IKC => 'unsubscribe', [qw( poe://LookupService/ServiceRegistrar )]);
365 $kernel->post( IKC => 'unregister', [qw( poe://LookupService )]);
366 #$kernel->post( IKC => 'unsubscribe', [qw( poe://me )]);
367 #$kernel->post( IKC => 'unregister', [qw( poe://me )]);
368 #$kernel->run_one_timeslice();
369 #$kernel->run_one_timeslice();
370 #$kernel->run_one_timeslice();
371 #return;
372
373 $kernel->post( 'IKC' => 'shutdown' );
374 #$kernel->run_one_timeslice();
375 #$kernel->run_one_timeslice();
376
377 $kernel->alias_remove('DeviceClient');
378 #$kernel->run_one_timeslice();
379 #$kernel->run_one_timeslice();
380
381 }
382
383 1;
384 __END__

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed