diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index 852446cdaf..f324e35168 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -106,7 +106,7 @@ case class UnhandledMessageException(msg: Any, ref: ActorRef = null) extends Run /** * This message is published to the EventStream whenever an Actor receives a message it doesn't understand */ -case class UnhandledMessage(@BeanProperty message: Any, @BeanProperty recipient: ActorRef) +case class UnhandledMessage(@BeanProperty message: Any, @BeanProperty sender: ActorRef, @BeanProperty recipient: ActorRef) /** * Classes for passing status back to the sender. @@ -271,13 +271,13 @@ trait Actor { *
* Is called when a message isn't handled by the current behavior of the actor * by default it fails with either a [[akka.actor.DeathPactException]] (in - * case of an unhandled [[akka.actor.Terminated]] message) or a - * [[akka.actor.UnhandledMessageException]]. + * case of an unhandled [[akka.actor.Terminated]] message) or publishes an [[akka.actor.UnhandledMessage]] + * to the actor's system's [[akka.event.EventStream]] */ def unhandled(message: Any) { message match { case Terminated(dead) ⇒ throw new DeathPactException(dead) - case _ ⇒ context.system.eventStream.publish(UnhandledMessage(message, self)) + case _ ⇒ context.system.eventStream.publish(UnhandledMessage(message, sender, self)) } } diff --git a/akka-docs/java/code/akka/docs/actor/MyReceivedTimeoutUntypedActor.java b/akka-docs/java/code/akka/docs/actor/MyReceivedTimeoutUntypedActor.java index 97a1998c79..8f6636a2c9 100644 --- a/akka-docs/java/code/akka/docs/actor/MyReceivedTimeoutUntypedActor.java +++ b/akka-docs/java/code/akka/docs/actor/MyReceivedTimeoutUntypedActor.java @@ -22,7 +22,7 @@ public class MyReceivedTimeoutUntypedActor extends UntypedActor { } else if (message == Actors.receiveTimeout()) { throw new RuntimeException("received timeout"); } else { - throw new UnhandledMessageException(message, getSelf()); + unhandled(message); } } } diff --git a/akka-docs/java/code/akka/docs/actor/MyUntypedActor.java b/akka-docs/java/code/akka/docs/actor/MyUntypedActor.java index 7b25ccee2e..a25e18f77d 100644 --- a/akka-docs/java/code/akka/docs/actor/MyUntypedActor.java +++ b/akka-docs/java/code/akka/docs/actor/MyUntypedActor.java @@ -16,7 +16,7 @@ public class MyUntypedActor extends UntypedActor { if (message instanceof String) log.info("Received String message: {}", message); else - throw new UnhandledMessageException(message, getSelf()); + unhandled(message); } } //#my-untyped-actor diff --git a/akka-docs/java/code/akka/docs/actor/UntypedActorSwapper.java b/akka-docs/java/code/akka/docs/actor/UntypedActorSwapper.java index b64ff195e3..0ebf543cdd 100644 --- a/akka-docs/java/code/akka/docs/actor/UntypedActorSwapper.java +++ b/akka-docs/java/code/akka/docs/actor/UntypedActorSwapper.java @@ -37,7 +37,7 @@ public class UntypedActorSwapper { } }); } else { - throw new UnhandledMessageException(message, getSelf()); + unhandled(message); } } } diff --git a/akka-docs/scala/actors.rst b/akka-docs/scala/actors.rst index c208497b7e..1a074b9ab6 100644 --- a/akka-docs/scala/actors.rst +++ b/akka-docs/scala/actors.rst @@ -142,7 +142,7 @@ The :class:`Actor` trait defines only one abstract method, the above mentioned :meth:`receive`, which implements the behavior of the actor. If the current actor behavior does not match a received message, :meth:`unhandled` -is called, which by default throws an :class:`UnhandledMessageException`. +is called, which by default publishes an ``akka.actor.UnhandledMessage(message, sender, recipient)`` In addition, it offers: