Exemplo n.º 1
0
 public Task RegisterProjectionGroup<T>(T @group) where T : IProjectionGroup
 {
     var createActorRoute = new CreateActorRouteMessage(typeof(SynchronizationProcessingActor<T>),
                                                        typeof(T).Name,
                                                        PoolKind.ConsistentHash,
                                                        @group.AcceptMessages.ToArray());
     return _routingActor.Ask<RouteCreated>(createActorRoute);
 }
Exemplo n.º 2
0
        public void Handle(CreateActorRouteMessage msg)
        {
            _monitor.IncrementMessagesReceived();
            var handleActor = CreateActor(msg.ActorType, CreateActorRouter(msg), msg.ActorName);

            foreach (var msgRoute in msg.Routes)
            {
                Log.Info("Subscribed {actor} to {messageType}", handleActor.Path, msgRoute.MessageType);
                _subscriber.Subscribe(msgRoute.MessageType, handleActor, Self);
            }

            Sender.Tell(RouteCreated.Instance);
        }
Exemplo n.º 3
0
        protected virtual RouterConfig CreateActorRouter(CreateActorRouteMessage msg)
        {
            switch (msg.PoolKind)
            {
            case PoolKind.Random:
                Log.Debug("Created random pool router to pass messages to {actor} ", msg.ActorName);
                return(new RandomPool(Environment.ProcessorCount));

            case PoolKind.ConsistentHash:
                Log.Debug("Created consistent hashing pool router to pass messages to {actor} ", msg.ActorName);

                var routesMap = msg.Routes.ToDictionary(r => CreateHandlerRouteMessage.GetTypeWithoutMetadata(r.MessageType),
                                                        r => r.CorrelationField);

                var pool = new ConsistentHashingPool(Environment.ProcessorCount,
                                                     message =>
                {
                    var idContainer = (message as IMessageMetadataEnvelop)?.Message ?? message;
                    string prop     = null;

                    foreach (var searchType in GetInterfacesAndBaseTypes(idContainer.GetType()))
                    {
                        if (!routesMap.TryGetValue(searchType, out prop))
                        {
                            continue;
                        }
                        var value = idContainer.GetType()
                                    .GetProperty(prop)
                                    .GetValue(idContainer);
                        return(value);
                    }
                    throw new ArgumentException($"Cannot find route for {message.GetType()}");
                }
                                                     );
                return(pool);

            case PoolKind.None:
                Log.Debug("Intentionally use {actor} without router", msg.ActorName);
                return(NoRouter.Instance);

            default:
                Log.Debug("{actor} defaulted to no router", msg.ActorName);

                return(NoRouter.Instance);
            }
        }
Exemplo n.º 4
0
 public Task RegisterSaga(ISagaDescriptor sagaDescriptor, string name)
 {
     var createActorRoute = CreateActorRouteMessage.ForSaga(sagaDescriptor, name);
     return _routingActor.Ask<RouteCreated>(createActorRoute);
 }
Exemplo n.º 5
0
 public Task RegisterAggregate(IAggregateCommandsHandlerDesriptor descriptor)
 {
     var name = $"Aggregate_{descriptor.AggregateType.Name}";
     var createActorRoute = CreateActorRouteMessage.ForAggregate(name, descriptor);
     return _routingActor.Ask<RouteCreated>(createActorRoute);
 }