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

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

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