public virtual void Execute(CancellationToken cancellationToken) { var availableWorker = _workerAvailabilityManager.GetAvailableWorker(); if (_configuration.Inbox.Distribute && availableWorker == null) { _threadActivity.Waiting(cancellationToken); return; } var messagePipeline = availableWorker == null ? _pipelineFactory.GetPipeline <InboxMessagePipeline>() : (IPipeline)_pipelineFactory.GetPipeline <DistributorPipeline>(); try { messagePipeline.State.SetAvailableWorker(availableWorker); messagePipeline.State.ResetWorking(); messagePipeline.State.SetCancellationToken(cancellationToken); messagePipeline.State.SetTransportMessage(null); messagePipeline.State.SetReceivedMessage(null); if (cancellationToken.IsCancellationRequested) { return; } messagePipeline.Execute(); if (messagePipeline.State.GetWorking()) { _events.OnThreadWorking(this, new ThreadStateEventArgs(typeof(InboxMessagePipeline))); _threadActivity.Working(); } else { _events.OnThreadWaiting(this, new ThreadStateEventArgs(typeof(InboxMessagePipeline))); _threadActivity.Waiting(cancellationToken); } } finally { _pipelineFactory.ReleasePipeline(messagePipeline); } }
public virtual void Execute(IThreadState state) { var availableWorker = _workerAvailabilityManager.GetAvailableWorker(); if (_configuration.Inbox.Distribute && availableWorker == null) { _threadActivity.Waiting(state); return; } var messagePipeline = availableWorker == null ? _pipelineFactory.GetPipeline <InboxMessagePipeline>() : (IPipeline)_pipelineFactory.GetPipeline <DistributorPipeline>(); try { messagePipeline.State.SetAvailableWorker(availableWorker); messagePipeline.State.ResetWorking(); messagePipeline.State.SetActiveState(state); if (!state.Active) { return; } messagePipeline.Execute(); if (messagePipeline.State.GetWorking()) { _events.OnThreadWorking(this, new ThreadStateEventArgs(typeof(InboxMessagePipeline))); _threadActivity.Working(); } else { _events.OnThreadWaiting(this, new ThreadStateEventArgs(typeof(InboxMessagePipeline))); _threadActivity.Waiting(state); } } finally { _pipelineFactory.ReleasePipeline(messagePipeline); } }