Пример #1
0
        public void Scatter(Envelope <TRequest> request, IGatherReceiver <TResponse> scatter)
        {
            var action  = new DispatchableScatter <TRequest, TResponse>(_action, request, Id, Name, scatter);
            var context = _workerPool.GetThreadPoolDispatcher();

            context.DispatchAction(action);
        }
Пример #2
0
 public DispatchableScatter(IParticipantReference <TRequest, TResponse> func, Envelope <TRequest> request, Guid participantId, string name, IGatherReceiver <TResponse> scatter)
 {
     _func         = func;
     _request      = request;
     _name         = name;
     _scatter      = scatter;
     ParticipantId = participantId;
 }
Пример #3
0
        public void Scatter(Envelope <TRequest> request, IGatherReceiver <TResponse> scatter)
        {
            var thread = _workerPool.GetFreeWorkerDispatcher();

            if (thread == null)
            {
                ImmediateParticipant <TRequest, TResponse> .GetResponses(Id, _func, request, scatter, Name);

                return;
            }

            var responseWaiter = new DispatchableScatter <TRequest, TResponse>(_func, request, Id, Name, scatter);

            thread.DispatchAction(responseWaiter);
        }
Пример #4
0
        public void Scatter <TRequest, TResponse>(string topic, Envelope <TRequest> envelope, IGatherReceiver <TResponse> scatter)
        {
            Assert.ArgumentNotNull(envelope, nameof(envelope));
            Assert.ArgumentNotNull(scatter, nameof(scatter));

            var topicEnvelope = envelope.RedirectToTopic(topic);
            var participants  = _store.GetParticipants <TRequest, TResponse>(topic);

            _log.Debug("Scattering RequestType={0} ResponseType={1} Topic={2}", typeof(TRequest).FullName, typeof(TResponse).FullName, topic);
            foreach (var participant in participants)
            {
                try
                {
                    scatter.AddParticipant(participant.Id);
                    participant.Scatter(topicEnvelope, scatter);
                }
                catch (Exception e)
                {
                    _log.Error($"Unhandled scatter request Type={typeof(TRequest).FullName}, {typeof(TResponse).FullName} Topic={topic}: {e.Message}\n{e.StackTrace}");
                }
                if (participant.ShouldStopParticipating)
                {
                    _store.RemoveParticipant(topic, participant);
                }
            }
        }
 public Receiver(ICircuitBreaker circuitBreaker, IGatherReceiver <TResponse> inner)
 {
     _circuitBreaker = circuitBreaker;
     _inner          = inner;
 }
Пример #6
0
 public static void GetResponses(Guid id, IParticipantReference <TRequest, TResponse> func, Envelope <TRequest> request, IGatherReceiver <TResponse> scatter, string name)
 {
     try
     {
         var response = func.Invoke(request);
         scatter.AddResponse(id, ScatterResponse <TResponse> .Success(id, name, response));
     }
     catch (Exception e)
     {
         scatter.AddResponse(id, ScatterResponse <TResponse> .Error(id, name, e));
     }
 }
Пример #7
0
 public void Scatter(Envelope <TRequest> request, IGatherReceiver <TResponse> scatter)
 {
     GetResponses(Id, _func, request, scatter, Name);
 }