public MarkAsQuarantined ( Akka.Actor.Address address, int uid, Akka.Remote.Deadline timeOfRelease ) : void | ||
address | Akka.Actor.Address | |
uid | int | |
timeOfRelease | Akka.Remote.Deadline | |
리턴 | void |
protected override SupervisorStrategy SupervisorStrategy() { return(new OneForOneStrategy(ex => { var directive = Directive.Stop; ex.Match() .With <InvalidAssociation>(ia => { log.Warning("Tried to associate with unreachable remote address [{0}]. " + "Address is now gated for {1} ms, all messages to this address will be delivered to dead letters. Reason: [{2}]", ia.RemoteAddress, settings.RetryGateClosedFor.TotalMilliseconds, ia.Message); endpoints.MarkAsFailed(Sender, Deadline.Now + settings.RetryGateClosedFor); AddressTerminatedTopic.Get(Context.System).Publish(new AddressTerminated(ia.RemoteAddress)); directive = Directive.Stop; }) .With <ShutDownAssociation>(shutdown => { log.Debug("Remote system with address [{0}] has shut down. " + "Address is not gated for {1}ms, all messages to this address will be delivered to dead letters.", shutdown.RemoteAddress, settings.RetryGateClosedFor.TotalMilliseconds); endpoints.MarkAsFailed(Sender, Deadline.Now + settings.RetryGateClosedFor); AddressTerminatedTopic.Get(Context.System).Publish(new AddressTerminated(shutdown.RemoteAddress)); directive = Directive.Stop; }) .With <HopelessAssociation>(hopeless => { if (settings.QuarantineDuration.HasValue && hopeless.Uid.HasValue) { endpoints.MarkAsQuarantined(hopeless.RemoteAddress, hopeless.Uid.Value, Deadline.Now + settings.QuarantineDuration.Value); eventPublisher.NotifyListeners(new QuarantinedEvent(hopeless.RemoteAddress, hopeless.Uid.Value)); } else { log.Warning("Association to [{0}] with unknown UID is irrecoverably failed. " + "Address cannot be quarantined without knowing the UID, gating instead for {1} ms.", hopeless.RemoteAddress, settings.RetryGateClosedFor.TotalMilliseconds); endpoints.MarkAsFailed(Sender, Deadline.Now + settings.RetryGateClosedFor); } AddressTerminatedTopic.Get(Context.System).Publish(new AddressTerminated(hopeless.RemoteAddress)); directive = Directive.Stop; }) .Default(msg => { if (msg is EndpointDisassociatedException || msg is EndpointAssociationException) { } //no logging else { log.Error(ex, ex.Message); } }); return directive; })); }
private void KeepQuarantinedOr(Address remoteAddress, Action body) { var uid = _endpoints.RefuseUid(remoteAddress); if (uid.HasValue) { _log.Info( "Quarantined address [{0}] is still unreachable or has not been restarted. Keeping it quarantined.", remoteAddress); // Restoring Quarantine marker overwritten by a Pass(endpoint, refuseUid) pair while probing remote system. _endpoints.MarkAsQuarantined(remoteAddress, uid.Value, Deadline.Now + _settings.QuarantineDuration); } else { body(); } }