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);
        }
Ejemplo n.º 2
0
        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();
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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)));
     }
 }