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); }
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); }
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); } }
public Task RegisterSaga(ISagaDescriptor sagaDescriptor, string name) { var createActorRoute = CreateActorRouteMessage.ForSaga(sagaDescriptor, name); return _routingActor.Ask<RouteCreated>(createActorRoute); }
public Task RegisterAggregate(IAggregateCommandsHandlerDesriptor descriptor) { var name = $"Aggregate_{descriptor.AggregateType.Name}"; var createActorRoute = CreateActorRouteMessage.ForAggregate(name, descriptor); return _routingActor.Ask<RouteCreated>(createActorRoute); }