my $self = bless { recv_queue => [],
request_queue => [],
+ force_recycle => 0,
requests => 0,
session_data => {},
callbacks => {},
return $self->{stateless};
}
+# When true, indicates the server drone should be killed (recycled)
+# after the current session has completed. This overrides the
+# configured max_request value.
+sub force_recycle {
+ my ($self, $force) = @_;
+ $self->{force_recycle} = $force if defined $force;
+ return $self->{force_recycle};
+}
+
# When we're a client and we want to connect to a remote service
sub create {
my $class = shift;
OpenSRF::Transport::SlimJabber::XMPPMessage->new(xml => $data)
);
- $self->keepalive_loop($session);
+ my $recycle = $self->keepalive_loop($session);
last if ++$self->{num_requests} == $self->{parent}->{max_requests};
+ if ($recycle) {
+ $chatty && $logger->internal(
+ "server: child exiting early on force_recycle");
+ last;
+ }
+
# Tell the parent process we are available to process requests
$self->send_status;
}
$chatty and $logger->internal("server: child done with request(s)");
+
+ # Capture the recycle option value before it's clobbered.
+ # The option may be set at any point along the life of the
+ # session. Once set, it remains set unless
+ # $session->force_recycle(0) is explicitly called.
+ my $recycle = $session->force_recycle;
+
$session->kill_me;
+ return $recycle;
}
# ----------------------------------------------------------------