Ejemplo n.º 1
0
		/// <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);
		}
Ejemplo n.º 2
0
		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();
		}