public void Handle(ProjectionManagementMessage.Command.StartSlaveProjections message) { var command = new StartSlaveProjectionsCommand { Name = message.Name, RunAs = message.RunAs, MasterCorrelationId = message.MasterCorrelationId.ToString("N"), MasterWorkerId = message.MasterWorkerId.ToString("N"), SlaveProjections = message.SlaveProjections, }; _writer.PublishCommand("$start-slave-projections", command); }
public void Handle(ProjectionManagementMessage.Command.StartSlaveProjections message) { var result = new Dictionary <string, SlaveProjectionCommunicationChannel[]>(); var counter = 0; foreach (var g in message.SlaveProjections.Definitions) { var @group = g; switch (g.RequestedNumber) { case SlaveProjectionDefinitions.SlaveProjectionRequestedNumber.One: case SlaveProjectionDefinitions.SlaveProjectionRequestedNumber.OnePerNode: { var resultArray = new SlaveProjectionCommunicationChannel[1]; result.Add(g.Name, resultArray); counter++; int queueIndex = GetNextWorkerIndex(); CINP( message, @group, resultArray, queueIndex, 0, () => CheckSlaveProjectionsStarted(message, ref counter, result)); break; } case SlaveProjectionDefinitions.SlaveProjectionRequestedNumber.OnePerThread: { var resultArray = new SlaveProjectionCommunicationChannel[_workers.Length]; result.Add(g.Name, resultArray); for (int index = 0; index < _workers.Length; index++) { counter++; CINP( message, @group, resultArray, index, index, () => CheckSlaveProjectionsStarted(message, ref counter, result)); } break; } default: throw new NotSupportedException(); } } }
private void CINP( ProjectionManagementMessage.Command.StartSlaveProjections message, SlaveProjectionDefinitions.Definition @group, SlaveProjectionCommunicationChannel[] resultArray, int queueIndex, int arrayIndex, Action completed) { var projectionCorrelationId = Guid.NewGuid(); var slaveProjectionName = message.Name + "-" + @group.Name + "-" + queueIndex; _awaitingSlaveProjections.Add( projectionCorrelationId, assigned => { var queueWorkerId = _workers[queueIndex]; resultArray[arrayIndex] = new SlaveProjectionCommunicationChannel( slaveProjectionName, queueWorkerId, assigned.SubscriptionId); completed(); _awaitingSlaveProjections.Remove(projectionCorrelationId); }); var initializer = new NewProjectionInitializer( ProjectionQueryId, slaveProjectionName, @group.Mode, @group.HandlerType, @group.Query, true, @group.EmitEnabled, @group.CheckpointsEnabled, @group.EnableRunAs, @group.TrackEmittedStreams, @group.RunAs1, replyEnvelope: null); initializer.CreateAndInitializeNewProjection( this, projectionCorrelationId, _workers[queueIndex], true, message.MasterWorkerId, message.MasterCorrelationId); }
private static void CheckSlaveProjectionsStarted( ProjectionManagementMessage.Command.StartSlaveProjections message, ref int counter, Dictionary <string, SlaveProjectionCommunicationChannel[]> result) { counter--; if (counter == 0) { message.Envelope.ReplyWith( new ProjectionManagementMessage.SlaveProjectionsStarted( message.MasterCorrelationId, message.MasterWorkerId, new SlaveProjectionCommunicationChannels(result))); } }