From f8ce3d541ed0c45a00af02f55f41e1fdf2b02b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bone=CC=81r?= Date: Mon, 14 Mar 2011 10:45:49 +0100 Subject: [PATCH 1/3] Changed API for EventHandler and added support for log levels --- .../src/main/scala/akka/actor/Actor.scala | 37 ++++++++++++++++++- .../src/main/scala/akka/actor/ActorRef.scala | 4 +- .../src/main/scala/akka/actor/Scheduler.scala | 8 ++-- .../src/main/scala/akka/config/Config.scala | 2 +- .../main/scala/akka/dataflow/DataFlow.scala | 2 +- .../ExecutorBasedEventDrivenDispatcher.scala | 4 +- .../src/main/scala/akka/dispatch/Future.scala | 8 ++-- .../scala/akka/dispatch/MessageHandling.scala | 2 +- .../akka/dispatch/ThreadPoolBuilder.scala | 4 +- .../src/main/scala/akka/routing/Pool.scala | 2 +- .../src/main/scala/akka/util/LockUtil.scala | 2 +- akka-http/src/main/scala/akka/http/Mist.scala | 4 +- .../scala/akka/http/Servlet30Context.scala | 2 +- .../main/scala/akka/security/Security.scala | 2 +- .../remote/netty/NettyRemoteSupport.scala | 20 +++++----- config/akka-reference.conf | 1 + 16 files changed, 69 insertions(+), 35 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index e1cced0ec0..42ee1c0eec 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -97,7 +97,11 @@ class ActorTimeoutException private[akka](message: String) extends AkkaEx * * Log an error event: *
- * EventHandler.notifyListeners(EventHandler.Error(exception, this, message.toString))
+ * EventHandler.notify(EventHandler.Error(exception, this, message.toString))
+ * 
+ * Or use the direct methods (better performance): + *
+ * EventHandler.error(exception, this, message.toString)
  * 
* @author Jonas Bonér */ @@ -114,7 +118,7 @@ object EventHandler extends ListenerManagement { 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".intern val info = "[INFO] [%s] [%s] [%s] %s".intern @@ -123,6 +127,35 @@ object EventHandler extends ListenerManagement { val EventHandlerDispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher(ID).build + val level: Class[_ <: Event] = config.getString("akka.event-handler-level", "DEBUG") match { + case "ERROR" => classOf[Error] + case "WARNING" => classOf[Warning] + case "INFO" => classOf[Info] + case "DEBUG" => classOf[Debug] + case unknown => throw new ConfigurationException( + "Configuration option 'akka.event-handler-level' is invalid [" + unknown + "]") + } + + def notify[T <: Event : ClassManifest](event: => T) { + if (classManifest[T].erasure.asInstanceOf[Class[_ <: Event]] == level) notifyListeners(event) + } + + def error(cause: Throwable, instance: AnyRef, message: => String) = { + if (level == classOf[Error]) notifyListeners(Error(cause, instance, message)) + } + + def warning(instance: AnyRef, message: => String) = { + if (level == classOf[Warning]) notifyListeners(Warning(instance, message)) + } + + def info(instance: AnyRef, message: => String) = { + if (level == classOf[Info]) notifyListeners(Info(instance, message)) + } + + def debug(instance: AnyRef, message: => String) = { + if (level == classOf[Debug]) notifyListeners(Debug(instance, message)) + } + def formattedTimestamp = DateFormat.getInstance.format(new Date) def stackTraceFor(e: Throwable) = { diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 8febe461ff..9e85a0f062 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -824,7 +824,7 @@ class LocalActorRef private[akka] ( } } catch { case e: Throwable => - EventHandler notifyListeners EventHandler.Error(e, this, messageHandle.message.toString) + EventHandler notify EventHandler.Error(e, this, messageHandle.message.toString) throw e } } @@ -987,7 +987,7 @@ class LocalActorRef private[akka] ( } private def handleExceptionInDispatch(reason: Throwable, message: Any) = { - EventHandler notifyListeners EventHandler.Error(reason, this, message.toString) + EventHandler notify EventHandler.Error(reason, this, message.toString) //Prevent any further messages to be processed until the actor has been restarted dispatcher.suspend(this) diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 5fab4f8046..851c9afa8d 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -38,7 +38,7 @@ object Scheduler { initialDelay, delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]] } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this, receiver + " @ " + message) + EventHandler notify EventHandler.Error(e, this, receiver + " @ " + message) throw SchedulerException(message + " could not be scheduled on " + receiver, e) } } @@ -59,7 +59,7 @@ object Scheduler { service.scheduleAtFixedRate(runnable, initialDelay, delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]] } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) throw SchedulerException("Failed to schedule a Runnable", e) } } @@ -74,7 +74,7 @@ object Scheduler { delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]] } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this, receiver + " @ " + message) + EventHandler notify EventHandler.Error(e, this, receiver + " @ " + message) throw SchedulerException( message + " could not be scheduleOnce'd on " + receiver, e) } } @@ -95,7 +95,7 @@ object Scheduler { service.schedule(runnable,delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]] } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) throw SchedulerException("Failed to scheduleOnce a Runnable", e) } } diff --git a/akka-actor/src/main/scala/akka/config/Config.scala b/akka-actor/src/main/scala/akka/config/Config.scala index bf57a161b5..c67cbf8591 100644 --- a/akka-actor/src/main/scala/akka/config/Config.scala +++ b/akka-actor/src/main/scala/akka/config/Config.scala @@ -77,7 +77,7 @@ object Config { } } catch { case e => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) throw e } } diff --git a/akka-actor/src/main/scala/akka/dataflow/DataFlow.scala b/akka-actor/src/main/scala/akka/dataflow/DataFlow.scala index 7e1cb6f99d..5b50886b64 100644 --- a/akka-actor/src/main/scala/akka/dataflow/DataFlow.scala +++ b/akka-actor/src/main/scala/akka/dataflow/DataFlow.scala @@ -148,7 +148,7 @@ object DataFlow { (out !! Get).as[T] } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) out ! Exit throw e } diff --git a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala index cba3dcec6c..692a5003d5 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala @@ -102,7 +102,7 @@ class ExecutorBasedEventDrivenDispatcher( try executorService.get() execute invocation catch { case e: RejectedExecutionException => - EventHandler notifyListeners EventHandler.Warning(this, e.toString) + EventHandler notify EventHandler.Warning(this, e.toString) throw e } } @@ -141,7 +141,7 @@ class ExecutorBasedEventDrivenDispatcher( executorService.get() execute mbox } catch { case e: RejectedExecutionException => - EventHandler notifyListeners EventHandler.Warning(this, e.toString) + EventHandler notify EventHandler.Warning(this, e.toString) mbox.dispatcherLock.unlock() throw e } diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 445fc451f2..719f266ad0 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -90,7 +90,7 @@ object Futures { result completeWithResult r } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) result completeWithException e } } @@ -258,7 +258,7 @@ sealed trait Future[T] { Right(f(v.right.get)) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) Left(e) }) } @@ -286,7 +286,7 @@ sealed trait Future[T] { f(v.right.get) onComplete (fa.completeWith(_)) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) fa completeWithException e } } @@ -316,7 +316,7 @@ sealed trait Future[T] { else Left(new MatchError(r)) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) Left(e) }) } diff --git a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala index efc9f96e72..215aab060d 100644 --- a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala +++ b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala @@ -36,7 +36,7 @@ final case class FutureInvocation(future: CompletableFuture[Any], function: () = Right(function.apply) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) Left(e) }) } diff --git a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala index c289968ced..553f3d986f 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala @@ -208,10 +208,10 @@ class BoundedExecutorDecorator(val executor: ExecutorService, bound: Int) extend }) } catch { case e: RejectedExecutionException => - EventHandler notifyListeners EventHandler.Warning(this, e.toString) + EventHandler notify EventHandler.Warning(this, e.toString) semaphore.release case e: Throwable => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) throw e } } diff --git a/akka-actor/src/main/scala/akka/routing/Pool.scala b/akka-actor/src/main/scala/akka/routing/Pool.scala index d8437590d1..39e1343506 100644 --- a/akka-actor/src/main/scala/akka/routing/Pool.scala +++ b/akka-actor/src/main/scala/akka/routing/Pool.scala @@ -84,7 +84,7 @@ trait DefaultActorPool extends ActorPool future completeWithResult (delegate !! msg).getOrElse(None) } catch { case e => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) future completeWithException e } } diff --git a/akka-actor/src/main/scala/akka/util/LockUtil.scala b/akka-actor/src/main/scala/akka/util/LockUtil.scala index 131f0a5a49..3e234b8dea 100644 --- a/akka-actor/src/main/scala/akka/util/LockUtil.scala +++ b/akka-actor/src/main/scala/akka/util/LockUtil.scala @@ -126,7 +126,7 @@ class Switch(startAsOn: Boolean = false) { action } catch { case t: Throwable => - EventHandler notifyListeners EventHandler.Error(t, this) + EventHandler notify EventHandler.Error(t, this) switch.compareAndSet(!from, from) //Revert status throw t } diff --git a/akka-http/src/main/scala/akka/http/Mist.scala b/akka-http/src/main/scala/akka/http/Mist.scala index 53a6d8f6d0..f144b69f29 100644 --- a/akka-http/src/main/scala/akka/http/Mist.scala +++ b/akka-http/src/main/scala/akka/http/Mist.scala @@ -389,7 +389,7 @@ trait RequestMethod { } } catch { case io: Exception => - EventHandler notifyListeners EventHandler.Error(io, this) + EventHandler notify EventHandler.Error(io, this) false } } @@ -408,7 +408,7 @@ trait RequestMethod { } } catch { case io: IOException => - EventHandler notifyListeners EventHandler.Error(io, this) + EventHandler notify EventHandler.Error(io, this) } } diff --git a/akka-http/src/main/scala/akka/http/Servlet30Context.scala b/akka-http/src/main/scala/akka/http/Servlet30Context.scala index 1caeeb83ef..3bc6c9261b 100644 --- a/akka-http/src/main/scala/akka/http/Servlet30Context.scala +++ b/akka-http/src/main/scala/akka/http/Servlet30Context.scala @@ -36,7 +36,7 @@ trait Servlet30Context extends AsyncListener { } catch { case ex: IllegalStateException => - EventHandler notifyListeners EventHandler.Error(ex, this) + EventHandler notify EventHandler.Error(ex, this) false } } diff --git a/akka-http/src/main/scala/akka/security/Security.scala b/akka-http/src/main/scala/akka/security/Security.scala index 6105c5265e..97b25e1b3e 100644 --- a/akka-http/src/main/scala/akka/security/Security.scala +++ b/akka-http/src/main/scala/akka/security/Security.scala @@ -369,7 +369,7 @@ trait SpnegoAuthenticationActor extends AuthenticationActor[SpnegoCredentials] { Some(UserInfo(user, null, rolesFor(user))) } catch { case e: PrivilegedActionException => { - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) None } } diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index d4f56dce23..698e18a9c3 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -445,7 +445,7 @@ class ActiveRemoteClientHandler( } } catch { case e: Throwable => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) client.notifyListeners(RemoteClientError(e, client.module, client.remoteAddress)) throw e } @@ -502,7 +502,7 @@ class ActiveRemoteClientHandler( .newInstance(exception.getMessage).asInstanceOf[Throwable] } catch { case problem: Throwable => - EventHandler notifyListeners EventHandler.Error(problem, this) + EventHandler notify EventHandler.Error(problem, this) UnparsableException(classname, exception.getMessage) } } @@ -582,7 +582,7 @@ class NettyRemoteServer(serverModule: NettyRemoteServerModule, val host: String, serverModule.notifyListeners(RemoteServerShutdown(serverModule)) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) } } } @@ -614,7 +614,7 @@ trait NettyRemoteServerModule extends RemoteServerModule { self: RemoteModule => } } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) notifyListeners(RemoteServerError(e, this)) } this @@ -923,7 +923,7 @@ class RemoteServerHandler( val actorRef = try { createActor(actorInfo, channel).start } catch { case e: SecurityException => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) write(channel, createErrorReplyMessage(e, request, AkkaActorType.ScalaActor)) server.notifyListeners(RemoteServerError(e, server)) return @@ -1011,7 +1011,7 @@ class RemoteServerHandler( write(channel, RemoteEncoder.encode(messageBuilder.build)) } catch { case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) server.notifyListeners(RemoteServerError(e, server)) } @@ -1027,11 +1027,11 @@ class RemoteServerHandler( } } catch { case e: InvocationTargetException => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) write(channel, createErrorReplyMessage(e.getCause, request, AkkaActorType.TypedActor)) server.notifyListeners(RemoteServerError(e, server)) case e: Exception => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) write(channel, createErrorReplyMessage(e, request, AkkaActorType.TypedActor)) server.notifyListeners(RemoteServerError(e, server)) } @@ -1091,7 +1091,7 @@ class RemoteServerHandler( actorRef } catch { case e: Throwable => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) server.notifyListeners(RemoteServerError(e, server)) throw e } @@ -1158,7 +1158,7 @@ class RemoteServerHandler( newInstance } catch { case e: Throwable => - EventHandler notifyListeners EventHandler.Error(e, this) + EventHandler notify EventHandler.Error(e, this) server.notifyListeners(RemoteServerError(e, server)) throw e } diff --git a/config/akka-reference.conf b/config/akka-reference.conf index 1b37d377dc..3ec6ff4566 100644 --- a/config/akka-reference.conf +++ b/config/akka-reference.conf @@ -13,6 +13,7 @@ akka { time-unit = "seconds" # Time unit for all timeout properties throughout the config event-handlers = ["akka.actor.EventHandler$DefaultListener"] # event handlers to register at boot time (EventHandler$DefaultListener logs to STDOUT) + event-handler-level = "DEBUG" # Options: ERROR, WARING, INFO, DEBUG # These boot classes are loaded (and created) automatically when the Akka Microkernel boots up # Can be used to bootstrap your application(s) From 8264ba8257101d9764023bcebbaaf53302056b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bone=CC=81r?= Date: Mon, 14 Mar 2011 11:12:23 +0100 Subject: [PATCH 2/3] Added generic event handler --- akka-actor/src/main/scala/akka/actor/Actor.scala | 10 ++++++---- config/akka-reference.conf | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index 42ee1c0eec..4efb740afa 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -123,6 +123,7 @@ object EventHandler extends ListenerManagement { 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 generic = "[GENERIC] [%s] [%s]".intern val ID = "default:error:handler".intern val EventHandlerDispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher(ID).build @@ -136,6 +137,8 @@ object EventHandler extends ListenerManagement { "Configuration option 'akka.event-handler-level' is invalid [" + unknown + "]") } + def notify(event: => AnyRef) = notifyListeners(event) + def notify[T <: Event : ClassManifest](event: => T) { if (classManifest[T].erasure.asInstanceOf[Class[_ <: Event]] == level) notifyListeners(event) } @@ -195,7 +198,8 @@ object EventHandler extends ListenerManagement { event.thread.getName, instance.getClass.getSimpleName, message)) - case _ => {} + case event => + println(generic.format(formattedTimestamp, event.toString)) } } @@ -265,9 +269,7 @@ object Actor extends ListenerManagement { type Receive = PartialFunction[Any, Unit] private[actor] val actorRefInCreation = new scala.util.DynamicVariable[Option[ActorRef]](None) - - - + /** * Creates an ActorRef out of the Actor with type T. *
diff --git a/config/akka-reference.conf b/config/akka-reference.conf
index 3ec6ff4566..458f937e5e 100644
--- a/config/akka-reference.conf
+++ b/config/akka-reference.conf
@@ -13,7 +13,7 @@ akka {
   time-unit = "seconds"      # Time unit for all timeout properties throughout the config
   
   event-handlers = ["akka.actor.EventHandler$DefaultListener"] # event handlers to register at boot time (EventHandler$DefaultListener logs to STDOUT)
-  event-handler-level = "DEBUG" # Options: ERROR, WARING, INFO, DEBUG
+  event-handler-level = "DEBUG" # Options: ERROR, WARNING, INFO, DEBUG
 
   # These boot classes are loaded (and created) automatically when the Akka Microkernel boots up
   #     Can be used to bootstrap your application(s)

From 0ec4d18a8345999f1606d8a23b4a91383abaf819 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Bone=CC=81r?= 
Date: Mon, 14 Mar 2011 13:38:27 +0100
Subject: [PATCH 3/3] changed event handler dispatcher name

---
 akka-actor/src/main/scala/akka/actor/Actor.scala       | 10 +++++-----
 .../src/main/scala/akka/dispatch/MessageHandling.scala |  6 +++---
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala
index 4efb740afa..07222fc1af 100644
--- a/akka-actor/src/main/scala/akka/actor/Actor.scala
+++ b/akka-actor/src/main/scala/akka/actor/Actor.scala
@@ -119,12 +119,12 @@ object EventHandler extends ListenerManagement {
   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".intern
-  val info    = "[INFO]  [%s] [%s] [%s] %s".intern
-  val debug   = "[DEBUG] [%s] [%s] [%s] %s".intern
+  val error   = "[ERROR]   [%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 generic = "[GENERIC] [%s] [%s]".intern
-  val ID      = "default:error:handler".intern
+  val ID      = "event:handler".intern
 
   val EventHandlerDispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher(ID).build
 
diff --git a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala
index 215aab060d..ee31535f28 100644
--- a/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala
+++ b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala
@@ -16,9 +16,9 @@ import akka.actor._
  * @author Jonas Bonér
  */
 final case class MessageInvocation(val receiver: ActorRef,
-                              val message: Any,
-                              val sender: Option[ActorRef],
-                              val senderFuture: Option[CompletableFuture[Any]]) {
+                                   val message: Any,
+                                   val sender: Option[ActorRef],
+                                   val senderFuture: Option[CompletableFuture[Any]]) {
   if (receiver eq null) throw new IllegalArgumentException("Receiver can't be null")
 
   def invoke = try {