Ejemplo n.º 1
0
        public Task Process(Immutable <PayloadMessage> message)
        {
            if (isPaused)
            {
                pausedMessages.Add(message);
                return(Task.CompletedTask);
            }
            if (orderingEnforcer.PreProcess(message))
            {
                bool isEnd = message.Value.IsEnd;
                List <TexeraTuple> batch = message.Value.Payload;
                orderingEnforcer.CheckStashed(ref batch, ref isEnd, message.Value.SenderIdentifer);
                var    orleansScheduler = TaskScheduler.Current;
                Action action           = async() =>
                {
                    BeforeProcessBatch(message, orleansScheduler);
                    if (batch != null)
                    {
                        ProcessBatch(batch);
                    }
                    if (isPaused)
                    {
                        return;
                    }
                    currentIndex = 0;
                    if (isEnd)
                    {
                        inputInfo[message.Value.SenderIdentifer.Split(' ')[0]]--;
                        currentEndFlagCount--;
                    }
                    AfterProcessBatch(message, orleansScheduler);
                    await Task.Factory.StartNew(() => { MakePayloadMessagesThenSend(); }, CancellationToken.None, TaskCreationOptions.None, orleansScheduler);

                    lock (actionQueue)
                    {
                        actionQueue.Dequeue();
                        if (!isPaused && actionQueue.Count > 0)
                        {
                            Task.Run(actionQueue.Peek());
                        }
                    }
                };
                lock (actionQueue)
                {
                    actionQueue.Enqueue(action);
                    if (actionQueue.Count == 1)
                    {
                        Task.Run(action);
                    }
                }
            }
            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        public virtual void Process(PayloadMessage message)
        {
            Action action = async() =>
            {
                if (currentStatus == ThreadStatus.Pausing)
                {
                    await self.OnTaskDidPaused();

                    return;
                }
                #if (PROFILING_ENABLED)
                DateTime start = DateTime.UtcNow;
                #endif
                if (messageChecked || orderingEnforcer.PreProcess(message))
                {
                    bool isEnd = message.IsEnd;
                    List <TexeraTuple> batch;
                    if (savedBatch != null)
                    {
                        batch = savedBatch;
                    }
                    else
                    {
                        batch = message.Payload;
                    }
                    if (!messageChecked)
                    {
                        orderingEnforcer.CheckStashed(ref batch, ref isEnd, message.SenderIdentifer);
                        savedBatch     = batch;
                        messageChecked = true;
                    }
                    #if (PROFILING_ENABLED)
                    preprocessTime += DateTime.UtcNow - start;
                    start           = DateTime.UtcNow;
                    #endif
                    List <TexeraTuple> outputList = new List <TexeraTuple>();
                    string             ext;
                    Guid from = message.SenderIdentifer.GetPrimaryKey(out ext);
                    processor.OnRegisterSource(from);
                    if (batch != null)
                    {
                        await ProcessBatch(batch, outputList);
                    }
                    if (currentStatus == ThreadStatus.Pausing)
                    {
                        //if we do not do so, the outputlist will be lost.
                        Console.WriteLine("Info: " + Utils.GetReadableName(self) + " paused while processing");
                        await MakePayloadMessagesThenSend(outputList);

                        await self.OnTaskDidPaused();

                        return;
                    }
                    batch          = null;
                    savedBatch     = null;
                    currentIndex   = 0;
                    messageChecked = false;
                    if (isEnd)
                    {
                        unFinishedUpstream[from].Remove(message.SenderIdentifer);
                        if (unFinishedUpstream[from].Count == 0)
                        {
                            unFinishedUpstream.Remove(from);
                            processor.MarkSourceCompleted(from);
                        }
                    }
                    #if (PROFILING_ENABLED)
                    processTime += DateTime.UtcNow - start;
                    start        = DateTime.UtcNow;
                    #endif
                    await MakePayloadMessagesThenSend(outputList);

                    #if (PROFILING_ENABLED)
                    sendingTime += DateTime.UtcNow - start;
                    #endif
                }
                bool noMoreAction = false;
                lock (actionQueue)
                {
                    actionQueue.Dequeue();
                    noMoreAction = actionQueue.Count == 0;
                    if (!noMoreAction)
                    {
                        Task.Run(actionQueue.Peek());
                    }
                }
                if (noMoreAction && currentStatus == ThreadStatus.Pausing)
                {
                    await self.OnTaskDidPaused();
                }
            };

            lock (actionQueue)
            {
                actionQueue.Enqueue(action);
                if (isActive && actionQueue.Count == 1)
                {
                    currentStatus = ThreadStatus.Running;
                    Task.Run(action);
                }
            }
            //return Task.CompletedTask;
        }