IRequestTarget IActorBoundChannelSync.BindActor(IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags) { if (actor == null) throw new ArgumentNullException(nameof(actor)); var actorId = BindActor(actor, types.Select(t => new BoundType(t)), bindingFlags); return actorId != 0 ? new AkkaReceiverTarget(actor) : null; }
public static async Task<IRequestTarget> BindActorOrOpenChannel( this ActorBoundChannelRef channel, IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags, string gatewayName, object tag, ActorBindingFlags bindingFlagsForOpenChannel) { if (string.IsNullOrEmpty(gatewayName) || (channel != null && channel.CastToIActorRef().Path.Address == actor.Path.Address)) { // link an actor to channel directly return await channel.BindActor(actor, types, bindingFlags); } else { // grant client to access an actor via gateway var gatewayRef = ((InternalActorRefBase)actor).Provider.ResolveActorRef(actor.Path.Root / "user" / gatewayName); var gateway = new ActorBoundGatewayRef(new AkkaReceiverTarget(gatewayRef)); return await gateway.WithTimeout(TimeSpan.FromSeconds(10)).OpenChannel(actor, types, tag, bindingFlagsForOpenChannel); } }
IRequestTarget IActorBoundGatewaySync.OpenChannel(IActorRef actor, TaggedType[] types, object tag, ActorBindingFlags bindingFlags) { if (actor == null) throw new ArgumentNullException(nameof(actor)); if (_isStopped) return null; // create token and add to waiting list string token; while (true) { token = Guid.NewGuid().ToString(); lock (_waitingMap) { if (_waitingMap.ContainsKey(token) == false) { _waitingMap.Add(token, new WaitingItem { Tag = tag, BindingActor = Tuple.Create(actor, types, bindingFlags), Time = DateTime.UtcNow }); break; } } } var address = string.Join("|", ChannelType.Tcp.ToString(), _initiator.ConnectEndPoint.ToString(), token); return new BoundActorTarget(1, address); }
bool IActorBoundChannelSync.BindType(IActorRef actor, TaggedType[] types) { if (actor == null) throw new ArgumentNullException(nameof(actor)); return BindType(actor, types.Select(t => new BoundType(t))); }
public BoundType(TaggedType type) { Type = type.Type; TagValue = type.TagValue; }
public BoundType(TaggedType type) { Type = type.Type; TagValue = type.TagValue; }
public static Task<IRequestTarget> BindActorOrOpenChannel( this ActorBoundChannelRef channel, IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags, string gatewayName, object tag) { return BindActorOrOpenChannel(channel, actor, types, bindingFlags, gatewayName, tag, bindingFlags); }