From 2168e861bf00ed353c2170dfbeb6eb7310b58225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bone=CC=81r?= Date: Mon, 7 Mar 2011 12:18:00 +0100 Subject: [PATCH] Changed event handler config to a list of the FQN of listeners --- .../src/main/scala/akka/actor/Actor.scala | 36 ++++++++++++------- .../ExecutorBasedEventDrivenDispatcher.scala | 2 +- .../akka/dispatch/ThreadPoolBuilder.scala | 2 +- config/akka-reference.conf | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index ecfc1f2cbe..e1cced0ec0 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -7,6 +7,7 @@ package akka.actor import akka.dispatch._ import akka.config.Config._ import akka.config.Supervision._ +import akka.config.ConfigurationException import akka.util.Helpers.{narrow, narrowSilently} import akka.util.ListenerManagement import akka.AkkaException @@ -78,16 +79,16 @@ class ActorTimeoutException private[akka](message: String) extends AkkaEx * * Create, add and remove a listener: *
- * val errorHandlerEventListener = new Actor {
+ * val errorHandlerEventListener = Actor.actorOf(new Actor {
  *   self.dispatcher = EventHandler.EventHandlerDispatcher
- *     
+ *
  *   def receive = {
  *     case EventHandler.Error(cause, instance, message) => ...
- *     case EventHandler.Warning(cause, instance, message) => ...
+ *     case EventHandler.Warning(instance, message) => ...
  *     case EventHandler.Info(instance, message) => ...
  *     case EventHandler.Debug(instance, message) => ...
  *   }
- * }
+ * })
  * 
  * EventHandler.addListener(errorHandlerEventListener)
  * ...
@@ -96,7 +97,7 @@ class ActorTimeoutException        private[akka](message: String) extends AkkaEx
  *
  * Log an error event:
  * 
- * EventHandler notifyListeners EventHandler.Error(exception, this, message.toString)
+ * EventHandler.notifyListeners(EventHandler.Error(exception, this, message.toString))
  * 
* @author Jonas Bonér */ @@ -110,12 +111,12 @@ object EventHandler extends ListenerManagement { val thread: Thread = Thread.currentThread } case class Error(cause: Throwable, instance: AnyRef, message: String = "") extends Event - case class Warning(cause: Throwable, instance: AnyRef, message: String = "") extends Event + case class Warning(instance: AnyRef, message: String = "") extends Event case class Info(instance: AnyRef, message: String = "") extends Event case class Debug(instance: AnyRef, message: String = "") extends Event val error = "[ERROR] [%s] [%s] [%s] %s\n%s".intern - val warning = "[WARN] [%s] [%s] [%s] %s\n%s".intern + val warning = "[WARN] [%s] [%s] [%s] %s".intern val info = "[INFO] [%s] [%s] [%s] %s".intern val debug = "[DEBUG] [%s] [%s] [%s] %s".intern val ID = "default:error:handler".intern @@ -143,13 +144,12 @@ object EventHandler extends ListenerManagement { instance.getClass.getSimpleName, message, stackTraceFor(cause))) - case event @ Warning(cause, instance, message) => + case event @ Warning(instance, message) => println(warning.format( formattedTimestamp, event.thread.getName, instance.getClass.getSimpleName, - message, - stackTraceFor(cause))) + message)) case event @ Info(instance, message) => println(info.format( formattedTimestamp, @@ -165,9 +165,19 @@ object EventHandler extends ListenerManagement { case _ => {} } } - - if (config.getBool("akka.default-error-handler", true)) - addListener(Actor.actorOf[DefaultListener].start) // FIXME configurable in config (on/off) + + config.getList("akka.event-handlers") foreach { listenerName => + try { + val clazz = Thread.currentThread.getContextClassLoader.loadClass(listenerName).asInstanceOf[Class[_]] + addListener(Actor.actorOf(clazz.asInstanceOf[Class[_ <: Actor]]).start) + } catch { + case e: Exception => + e.printStackTrace + new ConfigurationException( + "Event Handler specified in config can't be loaded [" + listenerName + + "] due to [" + e.toString + "]") + } + } } /** diff --git a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala index b312878315..2e70e8cce2 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala @@ -132,7 +132,7 @@ class ExecutorBasedEventDrivenDispatcher( executorService.get() execute mbox } catch { case e: RejectedExecutionException => - EventHandler notifyListeners EventHandler.Warning(e, this, _name) + EventHandler notifyListeners EventHandler.Warning(this, e.toString) mbox.dispatcherLock.unlock() throw e } diff --git a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala index 9efd64b576..c289968ced 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala @@ -208,7 +208,7 @@ class BoundedExecutorDecorator(val executor: ExecutorService, bound: Int) extend }) } catch { case e: RejectedExecutionException => - EventHandler notifyListeners EventHandler.Warning(e, this) + EventHandler notifyListeners EventHandler.Warning(this, e.toString) semaphore.release case e: Throwable => EventHandler notifyListeners EventHandler.Error(e, this) diff --git a/config/akka-reference.conf b/config/akka-reference.conf index 6a5c5559e0..def62bab9e 100644 --- a/config/akka-reference.conf +++ b/config/akka-reference.conf @@ -12,7 +12,7 @@ akka { time-unit = "seconds" # Time unit for all timeout properties throughout the config - default-error-handler = on # register the default error handler listener which logs errors to STDOUT + event-handlers = ["akka.actor.EventHandler$DefaultListener"] # register the default event handlers (the EventHandler.DefaultListener listener logs errors to STDOUT) # These boot classes are loaded (and created) automatically when the Akka Microkernel boots up # Can be used to bootstrap your application(s)