public override async Task Execute(HorseClient client, HorseMessage message, object model) { TModel t = (TModel)model; Exception exception = null; IConsumerFactory consumerFactory = null; try { if (_consumer != null) { await Consume(_consumer, message, t, client); } else if (_consumerFactoryCreator != null) { consumerFactory = _consumerFactoryCreator(); object consumerObject = await consumerFactory.CreateConsumer(_consumerType); IDirectConsumer <TModel> consumer = (IDirectConsumer <TModel>)consumerObject; await Consume(consumer, message, t, client); } else { throw new ArgumentNullException("There is no consumer defined"); } if (SendAck) { await client.SendAck(message); } } catch (Exception e) { if (SendNack) { await SendNegativeAck(message, client, e); } await SendExceptions(message, client, e); exception = e; } finally { if (consumerFactory != null) { consumerFactory.Consumed(exception); } } }
public override async Task Execute(HorseClient client, HorseMessage message, object model) { Exception exception = null; IConsumerFactory consumerFactory = null; bool respond = false; try { TRequest requestModel = (TRequest)model; IHorseRequestHandler <TRequest, TResponse> handler; if (_handler != null) { handler = _handler; } else if (_handlerFactoryCreator != null) { consumerFactory = _handlerFactoryCreator(); object consumerObject = await consumerFactory.CreateConsumer(_handlerType); handler = (IHorseRequestHandler <TRequest, TResponse>)consumerObject; } else { throw new ArgumentNullException("There is no consumer defined"); } try { TResponse responseModel = await Handle(handler, requestModel, message, client); HorseResultCode code = responseModel is null ? HorseResultCode.NoContent : HorseResultCode.Ok; HorseMessage responseMessage = message.CreateResponse(code); if (responseModel != null) { responseMessage.Serialize(responseModel, client.JsonSerializer); } respond = true; await client.SendAsync(responseMessage); } catch (Exception e) { ErrorResponse errorModel = await handler.OnError(e, requestModel, message, client); if (errorModel.ResultCode == HorseResultCode.Ok) { errorModel.ResultCode = HorseResultCode.Failed; } HorseMessage responseMessage = message.CreateResponse(errorModel.ResultCode); if (!string.IsNullOrEmpty(errorModel.Reason)) { responseMessage.SetStringContent(errorModel.Reason); } respond = true; await client.SendAsync(responseMessage); throw; } } catch (Exception e) { if (!respond) { try { HorseMessage response = message.CreateResponse(HorseResultCode.InternalServerError); await client.SendAsync(response); } catch { } } await SendExceptions(message, client, e); exception = e; } finally { if (consumerFactory != null) { consumerFactory.Consumed(exception); } } }