private async Task <TResponse> Handle(IHorseRequestHandler <TRequest, TResponse> handler, TRequest request, HorseMessage message, HorseClient client) { if (Retry == null) { return(await handler.Handle(request, message, client)); } int count = Retry.Count == 0 ? 100 : Retry.Count; for (int i = 0; i < count; i++) { try { return(await handler.Handle(request, message, client)); } catch (Exception e) { Type type = e.GetType(); if (Retry.IgnoreExceptions != null && Retry.IgnoreExceptions.Length > 0) { if (Retry.IgnoreExceptions.Any(x => x.IsAssignableFrom(type))) { throw; } } if (Retry.DelayBetweenRetries > 0) { await Task.Delay(Retry.DelayBetweenRetries); } } } throw new OperationCanceledException("Reached to maximum retry count and execution could not be completed"); }
/// <summary> /// Subscribes to handle requests /// </summary> public void OnRequest <TRequest, TResponse>(ushort contentType, IHorseRequestHandler <TRequest, TResponse> handler) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Request, Queue = null, ContentType = contentType, MessageType = typeof(TRequest), Action = null, HmqMessageParameter = true, ConsumerExecuter = new RequestHandlerExecuter <TRequest, TResponse>(handler.GetType(), handler, null) }; lock (_subscriptions) _subscriptions.Add(subscription); }
public RequestHandlerExecuter(Type handlerType, IHorseRequestHandler <TRequest, TResponse> handler, Func <IConsumerFactory> handlerFactoryCreator) { _handlerType = handlerType; _handler = handler; _handlerFactoryCreator = handlerFactoryCreator; }