Exemplo n.º 1
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();
                }
            }
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        private void CINP(
            ProjectionManagementMessage.StartSlaveProjections message, SlaveProjectionDefinitions.Definition @group,
            SlaveProjectionCommunicationChannel[] resultArray, int queueIndex, int arrayIndex, Action completed)
        {
            var projectionCorrelationId = Guid.NewGuid();
            var slaveProjectionName     = message.Name + "-" + @group.Name + "-" + queueIndex;
            var initializer             = new NewProjectionInitializer(
                ProjectionQueryId, slaveProjectionName, @group.Mode, @group.HandlerType, @group.Query, true,
                @group.EmitEnabled, @group.CheckpointsEnabled, @group.EnableRunAs, @group.RunAs);

            initializer.CreateAndInitializeNewProjection(
                this, managedProjection =>
            {
                resultArray[arrayIndex] = new SlaveProjectionCommunicationChannel(
                    slaveProjectionName, projectionCorrelationId, managedProjection.SlaveProjectionSubscriptionId,
                    _queues[queueIndex]);
                completed();
            }, projectionCorrelationId, queueIndex, true, message.ResultsPublisher, message.MasterCorrelationId);
        }