public IActorChannel GetActorChannel(string actorType) { IActorChannel channel = null; var actor = _actorKeys.Values.Where(a => a.Type == actorType).OrderBy(t => Guid.NewGuid()).FirstOrDefault(); if (actor != null && _channels.TryGetValue(actor.GetKey(), out channel)) { return(channel); } lock (_syncLock) { actor = _actorKeys.Values.Where(a => a.Type == actorType).OrderBy(t => Guid.NewGuid()).FirstOrDefault(); if (actor != null && _channels.TryGetValue(actor.GetKey(), out channel)) { return(channel); } channel = _factory.BuildActorChannel(_localActor, actorType); channel.Connected += OnActorConnected; channel.Disconnected += OnActorDisconnected; channel.DataReceived += OnActorDataReceived; ManualResetEventSlim waitingConnected = new ManualResetEventSlim(false); object connectedSender = null; ActorConnectedEventArgs connectedEvent = null; EventHandler <ActorConnectedEventArgs> onConnected = (s, e) => { connectedSender = s; connectedEvent = e; waitingConnected.Set(); }; channel.Connected += onConnected; channel.Open(); bool connected = waitingConnected.Wait(TimeSpan.FromSeconds(30)); channel.Connected -= onConnected; waitingConnected.Dispose(); if (connected) { _channels.Add(connectedEvent.RemoteActor.GetKey(), (IActorChannel)connectedSender); _actorKeys.Add(connectedEvent.RemoteActor.GetKey(), connectedEvent.RemoteActor); return(channel); } else { CloseChannel(channel); throw new ActorNotFoundException(string.Format( "Cannot connect remote actor, Type[{0}].", actorType)); } } }
public IActorChannel GetActorChannel(string actorType, string actorName) { IActorChannel channel = null; var actorKey = ActorDescription.GetKey(actorType, actorName); if (_channels.TryGetValue(actorKey, out channel)) { return(channel); } lock (_syncLock) { if (_channels.TryGetValue(actorKey, out channel)) { return(channel); } channel = _factory.BuildActorChannel(_localActor, actorType, actorName); channel.Connected += OnActorConnected; channel.Disconnected += OnActorDisconnected; channel.DataReceived += OnActorDataReceived; ManualResetEventSlim waitingConnected = new ManualResetEventSlim(false); object connectedSender = null; ActorConnectedEventArgs connectedEvent = null; EventHandler <ActorConnectedEventArgs> onConnected = (s, e) => { connectedSender = s; connectedEvent = e; waitingConnected.Set(); }; channel.Connected += onConnected; channel.Open(); bool connected = waitingConnected.Wait(TimeSpan.FromSeconds(5)); channel.Connected -= onConnected; waitingConnected.Dispose(); if (connected) { _channels.Add(connectedEvent.RemoteActor.GetKey(), (IActorChannel)connectedSender); _actorKeys.Add(connectedEvent.RemoteActor.GetKey(), connectedEvent.RemoteActor); return(channel); } else { CloseChannel(channel); throw new ActorNotFoundException(string.Format( "Cannot connect remote actor, Type[{0}], Name[{1}].", actorType, actorName)); } } }
private bool ActivateChannel(IActorChannel channel) { channel.ChannelConnected += OnActorChannelConnected; channel.ChannelDisconnected += OnActorChannelDisconnected; channel.ChannelDataReceived += OnActorChannelDataReceived; ManualResetEventSlim waitingConnected = new ManualResetEventSlim(false); object connectedSender = null; ActorChannelConnectedEventArgs connectedEvent = null; EventHandler <ActorChannelConnectedEventArgs> onConnected = (s, e) => { connectedSender = s; connectedEvent = e; waitingConnected.Set(); }; channel.ChannelConnected += onConnected; channel.Open(); bool connected = waitingConnected.Wait(TimeSpan.FromSeconds(5)); channel.ChannelConnected -= onConnected; waitingConnected.Dispose(); if (connected && channel.Active) { var item = new ChannelItem(((IActorChannel)connectedSender).Identifier, (IActorChannel)connectedSender); item.RemoteActorKey = connectedEvent.RemoteActor.GetKey(); item.RemoteActor = connectedEvent.RemoteActor; _channels.TryAdd(channel.Identifier, item); return(true); } else { CloseChannel(channel); return(false); } }
private bool ActivateChannel(IActorChannel channel) { channel.Connected += OnActorConnected; channel.Disconnected += OnActorDisconnected; channel.DataReceived += OnActorDataReceived; ManualResetEventSlim waitingConnected = new ManualResetEventSlim(false); object connectedSender = null; ActorConnectedEventArgs connectedEvent = null; EventHandler <ActorConnectedEventArgs> onConnected = (s, e) => { connectedSender = s; connectedEvent = e; waitingConnected.Set(); }; channel.Connected += onConnected; channel.Open(); bool connected = waitingConnected.Wait(TimeSpan.FromSeconds(5)); channel.Connected -= onConnected; waitingConnected.Dispose(); if (connected && channel.Active) { _channels.Add(connectedEvent.RemoteActor.GetKey(), (IActorChannel)connectedSender); _actorKeys.Add(connectedEvent.RemoteActor.GetKey(), connectedEvent.RemoteActor); return(true); } else { CloseChannel(channel); return(false); } }