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; }
InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags) { if (actor == null) throw new ArgumentNullException(nameof(actor)); var targetActor = actor.CastToIActorRef(); if (targetActor == null) throw new ArgumentException("InterfacedActorRef should have valid IActorRef target."); var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags); if (actorId == 0) return null; return actor; }
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); } }
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)); } }
protected int BindActor(IActorRef actor, IEnumerable <BoundType> boundTypes, ActorBindingFlags bindingFlags = 0) { if (_closed) { return(0); } lock (_boundActorLock) { if (GetBoundActorId(actor) != 0) { return(0); } var actorId = ++_lastBoundActorId; var boundActor = new BoundActor { Actor = actor, IsChildActor = (Self.Path == actor.Path.Parent), BindingFlags = bindingFlags, Types = boundTypes.ToList(), DerivedTypes = GetDerivedBoundTypes(boundTypes) }; _boundActorMap[actorId] = boundActor; _boundActorInverseMap[actor] = actorId; Context.Watch(actor); if (bindingFlags.HasFlag(ActorBindingFlags.OpenThenNotification)) { actor.Tell(new NotificationMessage { InvokePayload = new IActorBoundChannelObserver_PayloadTable.ChannelOpen_Invoke { channel = Self.Cast <ActorBoundChannelRef>(), tag = _tag }, }); } return(actorId); } }
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); }
InterfacedActorRef IActorBoundGatewaySync.OpenChannel(InterfacedActorRef actor, object tag, ActorBindingFlags bindingFlags) { var targetActor = actor.CastToIActorRef(); if (targetActor == null) throw new ArgumentNullException(nameof(actor)); var target = ((IActorBoundGatewaySync)this).OpenChannel(targetActor, new TaggedType[] { actor.InterfaceType }, bindingFlags); var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType()); InterfacedActorRefModifier.SetTarget(actorRef, target); return actorRef; }
InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags) { if (actor == null) throw new ArgumentNullException(nameof(actor)); var targetActor = actor.CastToIActorRef(); if (targetActor == null) throw new ArgumentException("InterfacedActorRef should have valid IActorRef target."); var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags); if (actorId == 0) return null; var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType()); InterfacedActorRefModifier.SetTarget(actorRef, new BoundActorTarget(actorId)); return actorRef; }
protected int BindActor(IActorRef actor, IEnumerable<BoundType> boundTypes, ActorBindingFlags bindingFlags = 0) { if (_closed) return 0; lock (_boundActorLock) { if (GetBoundActorId(actor) != 0) return 0; var actorId = ++_lastBoundActorId; var boundActor = new BoundActor { Actor = actor, IsChildActor = (Self.Path == actor.Path.Parent), BindingFlags = bindingFlags, Types = boundTypes.ToList(), DerivedTypes = GetDerivedBoundTypes(boundTypes) }; _boundActorMap[actorId] = boundActor; _boundActorInverseMap[actor] = actorId; Context.Watch(actor); if (bindingFlags.HasFlag(ActorBindingFlags.OpenThenNotification)) { actor.Tell(new NotificationMessage { InvokePayload = new IActorBoundChannelObserver_PayloadTable.ChannelOpen_Invoke { channel = Self.Cast<ActorBoundChannelRef>(), tag = _tag }, }); } return actorId; } }
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)); }
InterfacedActorRef IActorBoundGatewaySync.OpenChannel(InterfacedActorRef actor, object tag, ActorBindingFlags bindingFlags) { var targetActor = actor.CastToIActorRef(); if (targetActor == null) { throw new ArgumentNullException(nameof(actor)); } var target = ((IActorBoundGatewaySync)this).OpenChannel(targetActor, new TaggedType[] { actor.InterfaceType }, bindingFlags); var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType()); InterfacedActorRefModifier.SetTarget(actorRef, target); return(actorRef); }
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)); }
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 BoundActorTarget(actorId) : null); }
InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags) { if (actor == null) { throw new ArgumentNullException(nameof(actor)); } var targetActor = actor.CastToIActorRef(); if (targetActor == null) { throw new ArgumentException("InterfacedActorRef should have valid IActorRef target."); } var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags); if (actorId == 0) { return(null); } var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType()); InterfacedActorRefModifier.SetTarget(actorRef, new BoundActorTarget(actorId)); return(actorRef); }
InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags) { if (actor == null) { throw new ArgumentNullException(nameof(actor)); } var targetActor = actor.CastToIActorRef(); if (targetActor == null) { throw new ArgumentException("InterfacedActorRef should have valid IActorRef target."); } var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags); if (actorId == 0) { return(null); } return(actor); }
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); }