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

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

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