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); }
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; }
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); }
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; }
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)); } }
public void Scatter(Envelope <TRequest> request, IGatherReceiver <TResponse> scatter) { GetResponses(Id, _func, request, scatter, Name); }