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)