private IActorRef CreateEndpoint( Address remoteAddress, Address localAddress, AkkaProtocolTransport transport, RemoteSettings endpointSettings, bool writing, AkkaProtocolHandle handleOption = null, int?refuseUid = null) { System.Diagnostics.Debug.Assert(_transportMapping.ContainsKey(localAddress)); // refuseUid is ignored for read-only endpoints since the UID of the remote system is already known and has passed // quarantine checks IActorRef endpointActor; if (writing) { endpointActor = Context.ActorOf(RARP.For(Context.System) .ConfigureDispatcher( ReliableDeliverySupervisor.ReliableDeliverySupervisorProps(handleOption, localAddress, remoteAddress, refuseUid, transport, endpointSettings, new AkkaPduProtobuffCodec(), _receiveBuffers, endpointSettings.Dispatcher) .WithDeploy(Deploy.Local)), string.Format("reliableEndpointWriter-{0}-{1}", AddressUrlEncoder.Encode(remoteAddress), _endpointId.Next())); } else { endpointActor = Context.ActorOf(RARP.For(Context.System) .ConfigureDispatcher( EndpointWriter.EndpointWriterProps(handleOption, localAddress, remoteAddress, refuseUid, transport, endpointSettings, new AkkaPduProtobuffCodec(), _receiveBuffers, reliableDeliverySupervisor: null) .WithDeploy(Deploy.Local)), string.Format("endpointWriter-{0}-{1}", AddressUrlEncoder.Encode(remoteAddress), _endpointId.Next())); } Context.Watch(endpointActor); return(endpointActor); }
/// <summary> /// Start assumes that it cannot be followed by another Start() without having a Shutdown() first /// </summary> /// <exception cref="ConfigurationException"> /// This exception is thrown when no transports are enabled under the "akka.remote.enabled-transports" configuration setting. /// </exception> /// <exception cref="TaskCanceledException"> /// This exception is thrown when startup is canceled due to a timeout. /// </exception> /// <exception cref="TimeoutException"> /// This exception is thrown when startup times out. /// </exception> /// <exception cref="Exception"> /// This exception is thrown when a general error occurs during startup. /// </exception> public override void Start() { if (_endpointManager == null) { _log.Info("Starting remoting"); _endpointManager = System.SystemActorOf(RARP.For(System).ConfigureDispatcher( Props.Create(() => new EndpointManager(System.Settings.Config, _log)).WithDeploy(Deploy.Local)), EndpointManagerName); try { var addressPromise = new TaskCompletionSource <IList <ProtocolTransportAddressPair> >(); // tells the EndpointManager to start all transports and bind them to listenable addresses, and then set the results // of this promise to include them. _endpointManager.Tell(new EndpointManager.Listen(addressPromise)); addressPromise.Task.Wait(Provider.RemoteSettings.StartupTimeout); var akkaProtocolTransports = addressPromise.Task.Result; if (akkaProtocolTransports.Count == 0) { throw new ConfigurationException(@"No transports enabled under ""akka.remote.enabled-transports"""); } _addresses = new HashSet <Address>(akkaProtocolTransports.Select(a => a.Address)); IEnumerable <IGrouping <string, ProtocolTransportAddressPair> > tmp = akkaProtocolTransports.GroupBy(t => t.ProtocolTransport.SchemeIdentifier); _transportMapping = new Dictionary <string, HashSet <ProtocolTransportAddressPair> >(); foreach (var g in tmp) { var set = new HashSet <ProtocolTransportAddressPair>(g); _transportMapping.Add(g.Key, set); } _defaultAddress = akkaProtocolTransports.Head().Address; _addresses = new HashSet <Address>(akkaProtocolTransports.Select(x => x.Address)); _log.Info("Remoting started; listening on addresses : [{0}]", string.Join(",", _addresses.Select(x => x.ToString()))); _endpointManager.Tell(new EndpointManager.StartupFinished()); _eventPublisher.NotifyListeners(new RemotingListenEvent(_addresses.ToList())); } catch (TaskCanceledException ex) { NotifyError("Startup was canceled due to timeout", ex); throw; } catch (TimeoutException ex) { NotifyError("Startup timed out", ex); throw; } catch (Exception ex) { NotifyError("Startup failed", ex); throw; } } else { _log.Warning("Remoting was already started. Ignoring start attempt."); } }