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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by joko, Sun Jun 29 01:35:29 2003 UTC revision 1.2 by joko, Tue Jul 1 13:05:01 2003 UTC
# Line 2  Line 2 
2  ##  $Id$  ##  $Id$
3  ## ------------------------------------------------------------------------  ## ------------------------------------------------------------------------
4  ##  $Log$  ##  $Log$
5    ##  Revision 1.2  2003/07/01 13:05:01  joko
6    ##  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?
7    ##
8  ##  Revision 1.1  2003/06/29 01:35:29  joko  ##  Revision 1.1  2003/06/29 01:35:29  joko
9  ##  initial commit  ##  initial commit
10  ##  ##
# Line 29  sub new { Line 32  sub new {
32    #my $event_handler = lookupd->new();    #my $event_handler = lookupd->new();
33    POE::Session->create(    POE::Session->create(
34      object_states => [      object_states => [
35        $self => [qw( _start _stop boot_intercom )]        $self => [qw( _start _stop boot_intercom start_session waste_time watchdog )]
36      ]      ]
37    );    );
38    
# Line 76  sub boot_intercom { Line 79  sub boot_intercom {
79    create_ikc_client(    create_ikc_client(
80      host => $host,      host => $host,
81      port => 30,      port => 30,
82      name => 'Client',      #name => 'Client',
83        #on_connect => sub { $self->build(); },
84      on_connect => sub { $self->build(); },      on_connect => sub { $self->build(); },
85      subscribe => [qw( poe://LookupService/ServiceRegistrar/ )],      #subscribe => [qw( poe://LookupService/ServiceRegistrar )],
86    );      #subscribe => [qw( poe://LookupService/ServiceRegistrar )],
87      );
88      
89      #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' });
90      #$kernel->post( IKC => 'monitor', 'LookupService' => { register => 'start_session' });
91      #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' );
92      
93      # start up the watchdog which monitors the required IKC intercom session
94      #$kernel->yield('waste_time');
95      #$kernel->delay('watchdog', 2);
96    
97  };  };
98    
99    sub start_session {
100      #my $self = shift;
101      print STDERR "start_session", "\n";
102    }
103    
104  sub build {  sub build {
105    my $self = shift;    my $self = shift;
106    #print "BUILD", "\n";    print "build", "\n";
107    # create sessions that depend on the foreign kernel.    # create sessions that depend on the foreign kernel.
108    POE::Component::LookupClient::Session->new();    POE::Component::LookupClient::Session->new();
109  }  }
110    
111    sub watchdog {
112      my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
113      $self->debug("watchdog");
114    
115      #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' });
116    
117      #if (not defined $kernel->alias_resolve('DeviceClient')) {
118      if (not defined $kernel->alias_resolve('IKC')) {
119        print STDERR "Session died, trying to restart!", "\n";
120        #$kernel->yield('boot_intercom');
121        return;
122      }
123      
124      $kernel->delay('watchdog', 2);
125    };
126    
127    #------------------------------------------------------------------------------
128    # This event keeps this POE kernel alive.
129    # (stolen from POE::Component::IKC::Server, but not used 'til now...)
130    sub waste_time {
131        my($kernel, $heap)=@_[KERNEL, HEAP];
132        return if $heap->{'is a child'};
133    
134        unless($heap->{'been told we are parent'}) {
135            warn "$$: Telling everyone we are the parent\n";
136            $heap->{'been told we are parent'}=1;
137            $kernel->signal($kernel, '__parent');
138        }
139        if($heap->{'die'}) {
140            #DEBUG and warn "$$: Orderly shutdown\n";
141        } else {
142            $kernel->yield('watchdog');
143            $kernel->delay('waste_time', 60);
144        }
145        return;
146    }
147    
148    
149    
150    
151  package POE::Component::LookupClient::Session;  package POE::Component::LookupClient::Session;
# Line 112  sub new { Line 168  sub new {
168    
169    POE::Session->create(    POE::Session->create(
170      object_states => [      object_states => [
171        $self => [qw( _start _stop response register_lease renew_lease )]        $self => [qw( _start _stop on_response on_subscribe register_lease renew_lease remote_shutdown remote_timeout )]
172      ]      ]
173    );    );
174    
# Line 138  sub _start { Line 194  sub _start {
194        
195    # set up communication channel for asynchronous responses    # set up communication channel for asynchronous responses
196    $kernel->alias_set('DeviceClient');    $kernel->alias_set('DeviceClient');
197    $kernel->post('IKC', 'publish', 'DeviceClient', [qw( response )]);    $kernel->post('IKC', 'publish', 'DeviceClient', [qw( on_response )]);
198      
199    # try to register on startup    #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' );
200    $kernel->yield('register_lease');  
201      $kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'on_subscribe' );
202    
203      # try to register on startup?
204      #$kernel->yield('register_lease');
205        
206  };  };
207    
208  sub _stop {  sub _stop {
209    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
210    $self->debug("_stop");    $self->debug("_stop");
211    
212      # try to re-register if session dies?
213      #$kernel->yield('register_lease');
214      
215      #$kernel->alias_remove('DeviceClient');
216    
217      #$self = undef;
218  };  };
219    
220    
221    # Subscription receipt callback, see "perldoc POE::Component::IKC::Responder".
222    sub on_subscribe {
223      my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
224      $self->debug("on_subscribe");
225      # register lease on subscription
226      $kernel->yield('register_lease');
227    }
228    
229  # Main response dispatcher, this should dispatch to local states programmatically.  # Main response dispatcher, this should dispatch to local states programmatically.
230  sub response {  sub on_response {
231    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
232    #$self->debug("response");    #$self->debug("response");
233        
234      $heap->{'cancel timeout'} = 1;
235      
236    my $payload = $_[ARG0];    my $payload = $_[ARG0];
237    $payload ||= '';    $payload ||= '';
238        
239    # If registration succeeded, start the renewal cycle.    # If registration succeeded, start the renewal cycle.
240    if ($payload eq 'REG_OK') {    if ($payload eq 'REG_OK') {
241      $self->debug("Starting lease loop.");      $self->debug("Starting lease renewal loop.");
242        #$kernel->post( IKC => 'monitor', '*' => { shutdown => 'remote_shutdown' });
243      $kernel->yield( 'renew_lease' );      $kernel->yield( 'renew_lease' );
244    
245    } elsif ($payload eq 'LEASE_OK') {    } elsif ($payload eq 'LEASE_OK') {
# Line 172  sub response { Line 251  sub response {
251    } else {    } else {
252      #print Dumper($payload);      #print Dumper($payload);
253      $heap->{'destroy lease'} = 1;      $heap->{'destroy lease'} = 1;
254        #$kernel->alarm_remove_all();
255        
256    }    }
257        
# Line 180  sub response { Line 260  sub response {
260  sub register_lease {  sub register_lease {
261    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
262    $self->debug("register_lease");    $self->debug("register_lease");
263      
264    my $ONE_arg = "Hello World!";    my $ONE_arg = "Hello World!";
265        
266    # V1 - without subscription    # V1 - without subscription
267    #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/register_lease", $ONE_arg);    #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/register_lease", $ONE_arg);
268    # V2 - with subscription    # V2 - with subscription
269    $kernel->post( "poe://LookupService/ServiceRegistrar", "register_lease", $ONE_arg);    $kernel->post( "poe://LookupService/ServiceRegistrar", "register_lease", $ONE_arg );
270  }  }
271    
272  sub renew_lease {  sub renew_lease {
273    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];    my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
274        
275    if ($heap->{'destroy lease'}) {    if ($heap->{'destroy lease'}) {
276      $heap->{'destroy lease'} = 0;      #$heap->{'destroy lease'} = 0;
277        #$kernel->delay_set('remote_timeout');
278      $self->debug("destroyed lease");      $self->debug("destroyed lease");
279        #undef $self;
280        #$kernel->alias_remove('DeviceClient');
281        #undef $_[SESSION];
282        #$kernel->post( 'IKC' => 'shutdown' );
283        # clear delayed posts
284        #$kernel->delay('renew_lease');
285        #$kernel->delay('remote_timeout');
286      return;      return;
287    }    }
288        
289    $self->debug("renew_lease");    $self->debug("renew_lease");
290      
291      # check if remote kernel(s) are still around
292      #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', '', 'poe:remote_timeout');
293      #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', undef, 'poe:remote_timeout');
294      #$kernel->post('poe://remote/IKC', 'ping', 'poe:remote_timeout');
295      #$kernel->delay('remote_timeout', 5);   # timeout
296    
297    my $ONE_arg = '';    my $ONE_arg = '';
298    #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg);    #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg);
299    # V1 - without subscription    # V1 - without subscription
300    $kernel->post('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:response');    $kernel->post('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:on_response');
301      
302    # V2 - with subscription    # V2 - with subscription
303    #my $resp = $kernel->call( "poe://LookupService/ServiceRegistrar", "renew_lease", $ONE_arg);    #my $resp = $kernel->call( "poe://LookupService/ServiceRegistrar", "renew_lease", $ONE_arg);
304    #print $resp, "\n";    #print $resp, "\n";
305      
306      # V3 - have we been able to post?
307      #my $resp = $kernel->call('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:response');
308      #print "resp: $resp", "\n";
309    
310    # and again...    # and again...
311    $kernel->delay('renew_lease', 15);    $kernel->delay('renew_lease', 15);
312      #$kernel->delay_set('renew_lease', 15);
313      #$kernel->delay_add('renew_lease', 15);
314    
315      # timeout!?
316      #$kernel->delay('remote_timeout', 20);
317      $kernel->delay_add('remote_timeout', 20);
318      #$kernel->delay_set('remote_timeout', 5);
319      #$kernel->delay_set('remote_timeout', 20);
320    
321    }
322    
323    sub remote_shutdown {
324      my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
325      $self->debug("remote_shutdown");
326    }
327    
328    sub remote_timeout {
329      
330      #my ($pong) = $_[ARG0];
331      #return if $pong;            # all is cool
332      
333      my ($self, $kernel, $heap) = @_[OBJECT, KERNEL, HEAP];
334    
335    #=pod
336      if ($heap->{'cancel timeout'}) {
337        $heap->{'cancel timeout'} = 0;
338        return;
339      }
340    #=cut
341    
342      $self->debug("remote_timeout");
343    
344      $heap->{'destroy lease'} = 1;
345    
346      # YOW!  Remote kernel timed out.  RUN AROUND SCREAMING!
347      print STDERR "# YOW!  Remote kernel timed out.  RUN AROUND SCREAMING!", "\n";
348    
349      # free all resources that keep this session running
350      $kernel->delay('renew_lease');
351      $kernel->delay('remote_timeout');
352      
353      #$kernel->post( 'IKC' => 'shutdown' );
354      
355      #$kernel->alias_remove('DeviceClient');
356    
357      #$kernel->alias_remove('DeviceClient');
358      #$kernel->yield('renew_lease');
359    
360      #sub POE::Component::IKC::Responder::DEBUG { return 1; }
361      #$kernel->post( 'IKC' => 'unregister' );
362      
363      #print Dumper($kernel->alias_list());
364    
365      $kernel->post( IKC => 'retract', 'DeviceClient' => [qw( on_response )]);
366      #$kernel->post( IKC => 'retract', 'me' => [qw( on_response )]);
367      $kernel->post( IKC => 'unsubscribe', [qw( poe://LookupService/ServiceRegistrar )]);
368      $kernel->post( IKC => 'unregister', [qw( poe://LookupService )]);
369      #$kernel->post( IKC => 'unsubscribe', [qw( poe://me )]);
370      #$kernel->post( IKC => 'unregister', [qw( poe://me )]);
371      #$kernel->run_one_timeslice();
372      #$kernel->run_one_timeslice();
373      #$kernel->run_one_timeslice();
374      #return;
375      
376      $kernel->post( 'IKC' => 'shutdown' );
377      #$kernel->run_one_timeslice();
378      #$kernel->run_one_timeslice();
379    
380      $kernel->alias_remove('DeviceClient');
381      #$kernel->run_one_timeslice();
382      #$kernel->run_one_timeslice();
383    
384  }  }
385    
386  1;  1;

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

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