/// <summary> /// Try to fire actions for a message /// </summary> public void TryHandle(IPendingMessage<object> pendingMessage) { var messageObject = pendingMessage.Message; // ReSharper disable InvokeAsExtensionMethod var type = TypeExtensions.DirectlyImplementedInterfaces(messageObject.GetType()).Single(); // ReSharper restore InvokeAsExtensionMethod var matchingHandlers = GetMatchingHandlers(type).ToList(); if (!matchingHandlers.Any()) { pendingMessage.Finish(); Log.Warning("Ignoring message of type " + type + " because there are no handlers"); return; } HandleMessageWithInstancesOfHandlers(pendingMessage, matchingHandlers, messageObject); }
void HandleMessageWithInstancesOfHandlers(IPendingMessage<object> pendingMessage, IEnumerable<Type> matchingHandlers, object messageObject) { foreach (var handler in matchingHandlers) { var hooks = ObjectFactory.GetAllInstances<IEventHook>(); try { var instance = ObjectFactory.GetInstance(handler); handler.GetMethod("Handle", new[] { messageObject.GetType() }).Invoke(instance, new[] { messageObject }); FireHandledOkHooks((IMessage)messageObject, hooks); _sleeper.Reset(); } catch (Exception ex) { if (ex is TargetInvocationException) { ex = ex.InnerException; } try { if (ShouldRetry(ex.GetType(), handler)) { RetryFailedMessage(pendingMessage); } else pendingMessage.Finish(); FireHandlerFailedHooks((IMessage)messageObject, hooks, ex, handler); } catch (Exception exinner) { Log.Warning("Firing handler failed hooks didn't succeed: " + exinner.Message); } return; } } pendingMessage.Finish(); }