public MarkAsFailed ( IActorRef endpoint, Akka.Remote.Deadline timeOfRelease ) : void | ||
endpoint | IActorRef | |
timeOfRelease | Akka.Remote.Deadline | |
return | 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; })); }
protected override SupervisorStrategy SupervisorStrategy() { return(new OneForOneStrategy(ex => { var directive = Directive.Stop; ex.Match() .With <InvalidAssociation>(ia => { KeepQuarantinedOr(ia.RemoteAddress, () => { var causedBy = ia.InnerException == null ? "" : string.Format("Caused by: [{0}]", ia.InnerException); _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}] {3}", ia.RemoteAddress, _settings.RetryGateClosedFor.TotalMilliseconds, ia.Message, causedBy); _endpoints.MarkAsFailed(Sender, Deadline.Now + _settings.RetryGateClosedFor); }); if (ia.DisassociationInfo.HasValue && ia.DisassociationInfo == DisassociateInfo.Quarantined) { //TODO: add context.system.eventStream.publish(ThisActorSystemQuarantinedEvent(localAddress, remoteAddress)) } directive = Directive.Stop; }) .With <ShutDownAssociation>(shutdown => { KeepQuarantinedOr(shutdown.RemoteAddress, () => { _log.Debug("Remote system with address [{0}] has shut down. Address is now 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); }); directive = Directive.Stop; }) .With <HopelessAssociation>(hopeless => { if (hopeless.Uid.HasValue) { _log.Error("Association to [{0}] with UID [{1}] is irrecoverably failed. Quarantining address.", hopeless.RemoteAddress, hopeless.Uid); if (_settings.QuarantineDuration.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); } directive = Directive.Stop; }) .Default(msg => { if (msg is EndpointDisassociatedException || msg is EndpointAssociationException) { } //no logging else { _log.Error(ex, ex.Message); } _endpoints.MarkAsFailed(Sender, Deadline.Now + _settings.RetryGateClosedFor); directive = Directive.Stop; }); return directive; })); }