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);
     }
 }
Beispiel #4
0
 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);
        }
Beispiel #12
0
 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);
        }
Beispiel #15
0
        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);
 }