예제 #1
0
        protected MessageProcessor(
            DispatcherQueueSetting setting,
            IReliableLog <TMessage> inputMessageQueue,
            IReliableLog <OutputMessage> outputMessageQueue,
            IMessageFilteringEngine <TMessage> filteringEngine,
            IResultReporter resultReporter)
            : base(nameof(MessageProcessor <TMessage>))
        {
            this.setting            = setting;
            this.inputMessageQueue  = inputMessageQueue;
            this.outputMessageQueue = outputMessageQueue;
            this.filteringEngine    = filteringEngine;
            this.resultReporter     = resultReporter;

            this.processorComponents          = new ComponentManager(this.setting.Name, "MessageProcessorContainer");
            this.processorComponents.Faulted += (s, e) => this.Fault(e.Exception);

            this.messageDispatcher = MessageDispatcher.Create(
                this.setting,
                this.outputMessageQueue,
                this.resultReporter);
            this.processorComponents.Add(this.messageDispatcher);

            this.messagePump = MessagePump <TMessage> .Create(
                this.setting,
                this.inputMessageQueue,
                this.filteringEngine,
                this.messageDispatcher);

            this.processorComponents.Add(this.messagePump);
        }
예제 #2
0
        protected MessageDispatcher(
            DispatcherQueueSetting setting,
            IReliableLog <OutputMessage> outputMessageQueue,
            IResultReporter resultReporter)
            : base(nameof(MessageDispatcher))
        {
            this.setting            = setting;
            this.outputMessageQueue = outputMessageQueue;
            this.resultReporter     = resultReporter;
            this.pushWorkers        = new List <IPushWorker>();
            this.random             = new ThreadSafeRandom();

            this.dispatcherComponents          = new ComponentManager(this.setting.Name, "MessageDispatcherContainer");
            this.dispatcherComponents.Faulted += (s, e) => this.Fault(e.Exception);

            for (var i = 0; i < this.setting.PushWorkerCount; ++i)
            {
                var pushWorker = PushWorker.Create(
                    this.setting,
                    this.outputMessageQueue,
                    this,
                    this.resultReporter);

                this.pushWorkers.Add(pushWorker);
                this.dispatcherComponents.Add(pushWorker);
            }
        }
예제 #3
0
 public static IMessageDispatcher Create(
     DispatcherQueueSetting setting,
     IReliableLog <OutputMessage> outputMessageQueue,
     IResultReporter resultReporter)
 {
     return(new MessageDispatcher(
                setting,
                outputMessageQueue,
                resultReporter));
 }
예제 #4
0
        public MessageDispatcher(StatefulServiceContext context)
            : base(context)
        {
            this.components = new ComponentManager(nameof(MessageDispatcher), "RootContainer");

            var partitionSetting            = DispatcherPartitionSetting.Create();
            var resultReporter              = ResultReporter.Create();
            var inputMessageFilteringEngine = InputMessageFilteringEngine.Create(partitionSetting.InstantQueueSetting, resultReporter);

            // Delayed Queue
            IReliableLog <OutputMessage> nextOutputReliableLog = null;

            for (var i = partitionSetting.DelayedQueueSettings.Count - 1; i >= 0; i--)
            {
                var setting = partitionSetting.DelayedQueueSettings[i];
                var outputMessageFilteringEngine = OutputMessageFilteringEngine.Create(setting, inputMessageFilteringEngine, resultReporter);
                var outputReliableLog            = ReliableLog <OutputMessage> .Create(setting, this.StateManager);

                outputReliableLog = new DelayedReliableLog(outputReliableLog);
                var outputMessageProcessor = MessageProcessor <OutputMessage> .Create(
                    setting,
                    outputReliableLog,
                    nextOutputReliableLog ?? outputReliableLog,
                    outputMessageFilteringEngine,
                    resultReporter);

                this.components.Add(outputMessageFilteringEngine);
                this.components.Add(outputReliableLog);
                this.components.Add(outputMessageProcessor);

                nextOutputReliableLog = outputReliableLog;
            }

            // Instant Queue
            var inputReliableLog = ReliableLog <InputMessage> .Create(partitionSetting.InstantQueueSetting, this.StateManager);

            var inputMessageProcessor = MessageProcessor <InputMessage> .Create(
                partitionSetting.InstantQueueSetting,
                inputReliableLog,
                nextOutputReliableLog,
                inputMessageFilteringEngine,
                resultReporter);

            this.components.Add(inputMessageFilteringEngine);
            this.components.Add(inputReliableLog);
            this.components.Add(inputMessageProcessor);
            this.components.Add(resultReporter);

            this.inputReliableLog = inputReliableLog;
            this.resultReporter   = resultReporter;

            MessageDispatcher.AppName = context.CodePackageActivationContext.ApplicationTypeName;
        }
예제 #5
0
 public static IMessagePump Create(
     DispatcherQueueSetting setting,
     IReliableLog <TMessage> messageQueue,
     IMessageFilteringEngine <TMessage> filteringEngine,
     IMessageDispatcher messageDispatcher)
 {
     return(new MessagePump <TMessage>(
                setting,
                messageQueue,
                filteringEngine,
                messageDispatcher));
 }
예제 #6
0
 protected MessagePump(
     DispatcherQueueSetting setting,
     IReliableLog <TMessage> messageQueue,
     IMessageFilteringEngine <TMessage> filteringEngine,
     IMessageDispatcher messageDispatcher)
     : base(nameof(MessagePump <TMessage>))
 {
     this.setting           = setting;
     this.messageQueue      = messageQueue;
     this.filteringEngine   = filteringEngine;
     this.messageDispatcher = messageDispatcher;
     this.checkpointQueue   = new ConcurrentQueue <CheckpointInfo>();
 }
예제 #7
0
 protected PushWorker(
     DispatcherQueueSetting setting,
     IReliableLog <OutputMessage> outputMessageQueue,
     IMessageDispatcher messageDispatcher,
     IResultReporter resultReporter)
     : base(nameof(PushWorker))
 {
     this.setting                 = setting;
     this.outputMessageQueue      = outputMessageQueue;
     this.messageDispatcher       = messageDispatcher;
     this.pushTaskAvailableSignal = new AsyncSignal(SignalWaitTime);
     this.messageQueue            = new ConcurrentQueue <PushTaskInfo>();
     this.resultReporter          = resultReporter;
 }
예제 #8
0
 public static IMessageProcessor <TMessage> Create(
     DispatcherQueueSetting setting,
     IReliableLog <TMessage> inputMessageQueue,
     IReliableLog <OutputMessage> outputMessageQueue,
     IMessageFilteringEngine <TMessage> filteringEngine,
     IResultReporter resultReporter)
 {
     return(new MessageProcessor <TMessage>(
                setting,
                inputMessageQueue,
                outputMessageQueue,
                filteringEngine,
                resultReporter));
 }
예제 #9
0
 public DelayedReliableLog(IReliableLog <OutputMessage> reliableLog)
     : base(nameof(DelayedReliableLog))
 {
     this.reliableLog = reliableLog;
 }