diff --git a/akka-actor/src/main/scala/actor/ActorRef.scala b/akka-actor/src/main/scala/actor/ActorRef.scala index 821e699965..d7a1578379 100644 --- a/akka-actor/src/main/scala/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/actor/ActorRef.scala @@ -6,7 +6,6 @@ package se.scalablesolutions.akka.actor import se.scalablesolutions.akka.dispatch._ import se.scalablesolutions.akka.config.Config._ -import se.scalablesolutions.akka.config.{ AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy } import se.scalablesolutions.akka.config.ScalaConfig._ import se.scalablesolutions.akka.stm.global._ import se.scalablesolutions.akka.stm.TransactionManagement._ @@ -27,6 +26,7 @@ import java.util.{ Map => JMap } import java.lang.reflect.Field import scala.reflect.BeanProperty +import se.scalablesolutions.akka.config.{NoFaultHandlingStrategy, AllForOneStrategy, OneForOneStrategy, FaultHandlingStrategy} object ActorRefStatus { /** LifeCycles for ActorRefs @@ -126,39 +126,19 @@ trait ActorRef extends ActorRefShared with TransactionManagement with Logging wi /** * Akka Java API - * Set 'trapExit' to the list of exception classes that the actor should be able to trap - * from the actor it is supervising. When the supervising actor throws these exceptions - * then they will trigger a restart. - *

- * - * Trap all exceptions: - *

-   * getContext().setTrapExit(new Class[]{Throwable.class});
-   * 
- * - * Trap specific exceptions only: - *
-   * getContext().setTrapExit(new Class[]{MyApplicationException.class, MyApplicationError.class});
-   * 
- */ - def setTrapExit(exceptions: Array[Class[_ <: Throwable]]) = trapExit = exceptions.toList - def getTrapExit(): Array[Class[_ <: Throwable]] = trapExit.toArray - - /** - * Akka Java API - * If 'trapExit' is set for the actor to act as supervisor, then a 'faultHandler' must be defined. + * A faultHandler defines what should be done when a linked actor signals an error. *

* Can be one of: *

-   * getContext().setFaultHandler(new AllForOneStrategy(maxNrOfRetries, withinTimeRange));
+   * getContext().setFaultHandler(new AllForOneStrategy(new Class[]{Throwable.class},maxNrOfRetries, withinTimeRange));
    * 
* Or: *
-   * getContext().setFaultHandler(new OneForOneStrategy(maxNrOfRetries, withinTimeRange));
+   * getContext().setFaultHandler(new OneForOneStrategy(new Class[]{Throwable.class},maxNrOfRetries, withinTimeRange));
    * 
*/ - def setFaultHandler(handler: FaultHandlingStrategy) = this.faultHandler = Some(handler) - def getFaultHandler(): Option[FaultHandlingStrategy] = faultHandler + def setFaultHandler(handler: FaultHandlingStrategy) + def getFaultHandler(): FaultHandlingStrategy @volatile private[akka] var _dispatcher: MessageDispatcher = Dispatchers.defaultGlobalDispatcher @@ -520,7 +500,7 @@ trait ActorRef extends ActorRefShared with TransactionManagement with Logging wi * Links an other actor to this actor. Links are unidirectional and means that a the linking actor will * receive a notification if the linked actor has crashed. *

- * If the 'trapExit' member field has been set to at contain at least one exception class then it will + * If the 'trapExit' member field of the 'faultHandler' has been set to at contain at least one exception class then it will * 'trap' these exceptions and automatically restart the linked actors according to the restart strategy * defined by the 'faultHandler'. */ @@ -845,7 +825,7 @@ class LocalActorRef private[akka] ( * Links an other actor to this actor. Links are unidirectional and means that a the linking actor will * receive a notification if the linked actor has crashed. *

- * If the 'trapExit' member field has been set to at contain at least one exception class then it will + * If the 'trapExit' member field of the 'faultHandler' has been set to at contain at least one exception class then it will * 'trap' these exceptions and automatically restart the linked actors according to the restart strategy * defined by the 'faultHandler'. *

@@ -1034,20 +1014,19 @@ class LocalActorRef private[akka] ( } protected[akka] def handleTrapExit(dead: ActorRef, reason: Throwable): Unit = { - if (trapExit.exists(_.isAssignableFrom(reason.getClass))) { + if (faultHandler.trapExit.exists(_.isAssignableFrom(reason.getClass))) { faultHandler match { - case Some(AllForOneStrategy(maxNrOfRetries, withinTimeRange)) => + case AllForOneStrategy(_,maxNrOfRetries, withinTimeRange) => restartLinkedActors(reason, maxNrOfRetries, withinTimeRange) - case Some(OneForOneStrategy(maxNrOfRetries, withinTimeRange)) => + case OneForOneStrategy(_,maxNrOfRetries, withinTimeRange) => dead.restart(reason, maxNrOfRetries, withinTimeRange) - case None => throw new IllegalActorStateException( - "No 'faultHandler' defined for an actor with the 'trapExit' member field defined " + - "\n\tto non-empty list of exception classes - can't proceed " + toString) + case NoFaultHandlingStrategy => + notifySupervisorWithMessage(Exit(this, reason)) //This shouldn't happen } } else { - notifySupervisorWithMessage(Exit(this, reason)) // if 'trapExit' is not defined then pass the Exit on + notifySupervisorWithMessage(Exit(this, reason)) // if 'trapExit' isn't triggered then pass the Exit on } } @@ -1360,7 +1339,7 @@ object RemoteActorSystemMessage { */ private[akka] case class RemoteActorRef private[akka] ( classOrServiceName: String, - val className: String, + val actorClassName: String, val hostname: String, val port: Int, _timeout: Long, @@ -1374,7 +1353,6 @@ private[akka] case class RemoteActorRef private[akka] ( timeout = _timeout start - lazy val remoteClient = RemoteClientModule.clientFor(hostname, port, loader) def postMessageToMailbox(message: Any, senderOption: Option[ActorRef]): Unit = RemoteClientModule.send[Any]( @@ -1391,21 +1369,18 @@ private[akka] case class RemoteActorRef private[akka] ( else throw new IllegalActorStateException("Expected a future from remote call to actor " + toString) } - def start: ActorRef = { + def start: ActorRef = synchronized { _status = ActorRefStatus.RUNNING this } - def stop: Unit = { - _status = ActorRefStatus.SHUTDOWN - postMessageToMailbox(RemoteActorSystemMessage.Stop, None) + def stop: Unit = synchronized { + if (_status != ActorRefStatus.SHUTDOWN) { + _status = ActorRefStatus.SHUTDOWN + postMessageToMailbox(RemoteActorSystemMessage.Stop, None) + } } - /** - * Returns the class name for the Actor instance that is managed by the ActorRef. - */ - def actorClassName: String = className - protected[akka] def registerSupervisorAsRemoteActor: Option[Uuid] = None val remoteAddress: Option[InetSocketAddress] = Some(new InetSocketAddress(hostname, port)) @@ -1496,47 +1471,21 @@ trait ScalaActorRef extends ActorRefShared { ref: ActorRef => /** * User overridable callback/setting. - * *

- * Set trapExit to the list of exception classes that the actor should be able to trap - * from the actor it is supervising. When the supervising actor throws these exceptions - * then they will trigger a restart. - *

- * - * Trap no exceptions: - *

-   * trapExit = Nil
-   * 
- * - * Trap all exceptions: - *
-   * trapExit = List(classOf[Throwable])
-   * 
- * - * Trap specific exceptions only: - *
-   * trapExit = List(classOf[MyApplicationException], classOf[MyApplicationError])
-   * 
- */ - @volatile - var trapExit: List[Class[_ <: Throwable]] = Nil - - /** - * User overridable callback/setting. - *

- * If 'trapExit' is set for the actor to act as supervisor, then a faultHandler must be defined. + * Don't forget to supply a List of exception types to intercept (trapExit) *

* Can be one of: *

-   *  faultHandler = Some(AllForOneStrategy(maxNrOfRetries, withinTimeRange))
+   *  faultHandler = AllForOneStrategy(trapExit = List(classOf[Exception]),maxNrOfRetries, withinTimeRange)
    * 
* Or: *
-   *  faultHandler = Some(OneForOneStrategy(maxNrOfRetries, withinTimeRange))
+   *  faultHandler = OneForOneStrategy(trapExit = List(classOf[Exception]),maxNrOfRetries, withinTimeRange)
    * 
*/ @volatile - var faultHandler: Option[FaultHandlingStrategy] = None + @BeanProperty + var faultHandler: FaultHandlingStrategy = NoFaultHandlingStrategy /** * The reference sender Actor of the last received message. diff --git a/akka-actor/src/main/scala/actor/Supervisor.scala b/akka-actor/src/main/scala/actor/Supervisor.scala index 28d883e5ea..ba559e6945 100644 --- a/akka-actor/src/main/scala/actor/Supervisor.scala +++ b/akka-actor/src/main/scala/actor/Supervisor.scala @@ -79,14 +79,14 @@ object Supervisor { object SupervisorFactory { def apply(config: SupervisorConfig) = new SupervisorFactory(config) - private[akka] def retrieveFaultHandlerAndTrapExitsFrom(config: SupervisorConfig): - Tuple2[FaultHandlingStrategy, List[Class[_ <: Throwable]]] = config match { - case SupervisorConfig(RestartStrategy(scheme, maxNrOfRetries, timeRange, trapExceptions), _) => - scheme match { - case AllForOne => (AllForOneStrategy(maxNrOfRetries, timeRange), trapExceptions) - case OneForOne => (OneForOneStrategy(maxNrOfRetries, timeRange), trapExceptions) - } - } + private[akka] def retrieveFaultHandlerAndTrapExitsFrom(config: SupervisorConfig): FaultHandlingStrategy = + config match { + case SupervisorConfig(RestartStrategy(scheme, maxNrOfRetries, timeRange, trapExceptions), _) => + scheme match { + case AllForOne => AllForOneStrategy(trapExceptions,maxNrOfRetries, timeRange) + case OneForOne => OneForOneStrategy(trapExceptions,maxNrOfRetries, timeRange) + } + } } /** @@ -99,9 +99,8 @@ class SupervisorFactory private[akka] (val config: SupervisorConfig) extends Log def newInstance: Supervisor = newInstanceFor(config) - def newInstanceFor(config: SupervisorConfig): Supervisor = { - val (handler, trapExits) = SupervisorFactory.retrieveFaultHandlerAndTrapExitsFrom(config) - val supervisor = new Supervisor(handler, trapExits) + def newInstanceFor(config: SupervisorConfig): Supervisor = { + val supervisor = new Supervisor(SupervisorFactory.retrieveFaultHandlerAndTrapExitsFrom(config)) supervisor.configure(config) supervisor.start supervisor @@ -121,13 +120,13 @@ class SupervisorFactory private[akka] (val config: SupervisorConfig) extends Log * @author Jonas Bonér */ sealed class Supervisor private[akka] ( - handler: FaultHandlingStrategy, trapExceptions: List[Class[_ <: Throwable]]) { + handler: FaultHandlingStrategy) { import Supervisor._ private val _childActors = new ConcurrentHashMap[String, List[ActorRef]] private val _childSupervisors = new CopyOnWriteArrayList[Supervisor] - private[akka] val supervisor = actorOf(new SupervisorActor(handler, trapExceptions)).start + private[akka] val supervisor = actorOf(new SupervisorActor(handler)).start def uuid = supervisor.uuid @@ -179,13 +178,9 @@ sealed class Supervisor private[akka] ( * * @author Jonas Bonér */ -final class SupervisorActor private[akka] ( - handler: FaultHandlingStrategy, - trapExceptions: List[Class[_ <: Throwable]]) extends Actor { +final class SupervisorActor private[akka] (handler: FaultHandlingStrategy) extends Actor { import self._ - - trapExit = trapExceptions - faultHandler = Some(handler) + faultHandler = handler override def postStop(): Unit = shutdownLinkedActors diff --git a/akka-actor/src/main/scala/config/SupervisionConfig.scala b/akka-actor/src/main/scala/config/SupervisionConfig.scala index 43a5e21395..12202f5d9d 100644 --- a/akka-actor/src/main/scala/config/SupervisionConfig.scala +++ b/akka-actor/src/main/scala/config/SupervisionConfig.scala @@ -7,20 +7,45 @@ package se.scalablesolutions.akka.config import se.scalablesolutions.akka.actor.{ActorRef} import se.scalablesolutions.akka.dispatch.MessageDispatcher -sealed abstract class FaultHandlingStrategy -object AllForOneStrategy { - def apply(maxNrOfRetries: Int, withinTimeRange: Int): AllForOneStrategy = - AllForOneStrategy(if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), - if (withinTimeRange < 0) None else Some(withinTimeRange)) +sealed abstract class FaultHandlingStrategy { + def trapExit: List[Class[_ <: Throwable]] +} + +object AllForOneStrategy { + def apply(trapExit: List[Class[_ <: Throwable]], maxNrOfRetries: Int, withinTimeRange: Int) = + new AllForOneStrategy(trapExit, if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), if (withinTimeRange < 0) None else Some(withinTimeRange)) + def apply(trapExit: Array[Class[Throwable]], maxNrOfRetries: Int, withinTimeRange: Int) = + new AllForOneStrategy(trapExit.toList,maxNrOfRetries,withinTimeRange) +} + +case class AllForOneStrategy(trapExit: List[Class[_ <: Throwable]], + maxNrOfRetries: Option[Int] = None, + withinTimeRange: Option[Int] = None) extends FaultHandlingStrategy { + def this(trapExit: List[Class[_ <: Throwable]],maxNrOfRetries: Int, withinTimeRange: Int) = + this(trapExit, if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), if (withinTimeRange < 0) None else Some(withinTimeRange)) + def this(trapExit: Array[Class[Throwable]],maxNrOfRetries: Int, withinTimeRange: Int) = + this(trapExit.toList,maxNrOfRetries,withinTimeRange) } -case class AllForOneStrategy(maxNrOfRetries: Option[Int] = None, withinTimeRange: Option[Int] = None) extends FaultHandlingStrategy object OneForOneStrategy { - def apply(maxNrOfRetries: Int, withinTimeRange: Int): OneForOneStrategy = - this(if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), - if (withinTimeRange < 0) None else Some(withinTimeRange)) + def apply(trapExit: List[Class[_ <: Throwable]], maxNrOfRetries: Int, withinTimeRange: Int) = + new OneForOneStrategy(trapExit, if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), if (withinTimeRange < 0) None else Some(withinTimeRange)) + def apply(trapExit: Array[Class[Throwable]], maxNrOfRetries: Int, withinTimeRange: Int) = + new OneForOneStrategy(trapExit.toList,maxNrOfRetries,withinTimeRange) +} + +case class OneForOneStrategy(trapExit: List[Class[_ <: Throwable]], + maxNrOfRetries: Option[Int] = None, + withinTimeRange: Option[Int] = None) extends FaultHandlingStrategy { + def this(trapExit: List[Class[_ <: Throwable]],maxNrOfRetries: Int, withinTimeRange: Int) = + this(trapExit, if (maxNrOfRetries < 0) None else Some(maxNrOfRetries), if (withinTimeRange < 0) None else Some(withinTimeRange)) + def this(trapExit: Array[Class[Throwable]],maxNrOfRetries: Int, withinTimeRange: Int) = + this(trapExit.toList,maxNrOfRetries,withinTimeRange) +} + +case object NoFaultHandlingStrategy extends FaultHandlingStrategy { + def trapExit: List[Class[_ <: Throwable]] = Nil } -case class OneForOneStrategy(maxNrOfRetries: Option[Int] = None, withinTimeRange: Option[Int] = None) extends FaultHandlingStrategy /** * Configuration classes - not to be used as messages. diff --git a/akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala b/akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala index b9fa238963..7dd7545d34 100644 --- a/akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala +++ b/akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala @@ -22,8 +22,7 @@ class RestartStrategySpec extends JUnitSuite { def slaveShouldStayDeadAfterMaxRestarts = { val boss = actorOf(new Actor{ - self.trapExit = List(classOf[Throwable]) - self.faultHandler = Some(OneForOneStrategy(1, 1000)) + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), 1, 1000) protected def receive = { case _ => () } }).start @@ -75,8 +74,7 @@ class RestartStrategySpec extends JUnitSuite { def slaveShouldBeImmortalWithoutMaxRestarts = { val boss = actorOf(new Actor{ - self.trapExit = List(classOf[Throwable]) - self.faultHandler = Some(OneForOneStrategy(None, None)) + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), None, None) protected def receive = { case _ => () } }).start diff --git a/akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala b/akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala index ffc9dbd860..b1f8af27c0 100644 --- a/akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala +++ b/akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala @@ -37,8 +37,7 @@ class SupervisorHierarchySpec extends JUnitSuite { val workerThree = actorOf(new CountDownActor(countDown)) val boss = actorOf(new Actor{ - self.trapExit = List(classOf[Throwable]) - self.faultHandler = Some(OneForOneStrategy(5, 1000)) + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), 5, 1000) protected def receive = { case _ => () } }).start @@ -63,8 +62,7 @@ class SupervisorHierarchySpec extends JUnitSuite { val countDown = new CountDownLatch(2) val crasher = actorOf(new CountDownActor(countDown)) val boss = actorOf(new Actor{ - self.trapExit = List(classOf[Throwable]) - self.faultHandler = Some(OneForOneStrategy(1, 5000)) + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), 1, 5000) protected def receive = { case MaximumNumberOfRestartsWithinTimeRangeReached(_, _, _, _) => countDown.countDown diff --git a/akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala b/akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala index f7d1752ded..d7390a0d43 100644 --- a/akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala +++ b/akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala @@ -95,8 +95,7 @@ object SupervisorSpec { } class Master extends Actor { - self.trapExit = classOf[Exception] :: Nil - self.faultHandler = Some(OneForOneStrategy(5, 1000)) + self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 5, 1000) val temp = self.spawnLink[TemporaryActor] override def receive = { case Die => temp !! (Die, 5000) diff --git a/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/AMQP.scala b/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/AMQP.scala index cd73d27e03..09cfd47add 100644 --- a/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/AMQP.scala +++ b/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/AMQP.scala @@ -184,8 +184,7 @@ object AMQP { class AMQPSupervisorActor extends Actor { import self._ - faultHandler = Some(OneForOneStrategy(5, 5000)) - trapExit = List(classOf[Throwable]) + faultHandler = OneForOneStrategy(List(classOf[Throwable]),5, 5000) def receive = { case _ => {} // ignore all messages diff --git a/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/FaultTolerantConnectionActor.scala b/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/FaultTolerantConnectionActor.scala index bf5a192299..2bb821d5eb 100644 --- a/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/FaultTolerantConnectionActor.scala +++ b/akka-amqp/src/main/scala/se/scalablesolutions/akka/amqp/FaultTolerantConnectionActor.scala @@ -17,9 +17,7 @@ private[amqp] class FaultTolerantConnectionActor(connectionParameters: Connectio self.id = "amqp-connection-%s".format(host) self.lifeCycle = Permanent - - self.trapExit = List(classOf[Throwable]) - self.faultHandler = Some(OneForOneStrategy(5, 5000)) + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]),5, 5000) val reconnectionTimer = new Timer("%s-timer".format(self.id)) diff --git a/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala b/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala index e5b60b364f..b65f833763 100644 --- a/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala +++ b/akka-samples/akka-sample-chat/src/main/scala/ChatServer.scala @@ -170,9 +170,7 @@ trait RedisChatStorageFactory { this: Actor => * Chat server. Manages sessions and redirects all other messages to the Session for the client. */ trait ChatServer extends Actor { - self.faultHandler = Some(OneForOneStrategy(5, 5000)) - self.trapExit = List(classOf[Exception]) - + self.faultHandler = OneForOneStrategy(List(classOf[Exception]),5, 5000) val storage: ActorRef log.info("Chat server is starting up...") diff --git a/akka-typed-actor/src/main/scala/actor/TypedActor.scala b/akka-typed-actor/src/main/scala/actor/TypedActor.scala index 48e0d5a405..8b9cc2034a 100644 --- a/akka-typed-actor/src/main/scala/actor/TypedActor.scala +++ b/akka-typed-actor/src/main/scala/actor/TypedActor.scala @@ -665,13 +665,12 @@ object TypedActor extends Logging { * @param trapExceptions array of exceptions that should be handled by the supervisor */ def link(supervisor: AnyRef, supervised: AnyRef, - handler: FaultHandlingStrategy, trapExceptions: Array[Class[_ <: Throwable]]) = { + handler: FaultHandlingStrategy) = { val supervisorActor = actorFor(supervisor).getOrElse( throw new IllegalActorStateException("Can't link when the supervisor is not an Typed Actor")) val supervisedActor = actorFor(supervised).getOrElse( throw new IllegalActorStateException("Can't link when the supervised is not an Typed Actor")) - supervisorActor.trapExit = trapExceptions.toList - supervisorActor.faultHandler = Some(handler) + supervisorActor.faultHandler = handler supervisorActor.link(supervisedActor) } @@ -688,18 +687,6 @@ object TypedActor extends Logging { supervisorActor.unlink(supervisedActor) } - /** - * Sets the trap exit for the given supervisor Typed Actor. - * @param supervisor the supervisor Typed Actor - * @param trapExceptions array of exceptions that should be handled by the supervisor - */ - def trapExit(supervisor: AnyRef, trapExceptions: Array[Class[_ <: Throwable]]) = { - val supervisorActor = actorFor(supervisor).getOrElse( - throw new IllegalActorStateException("Can't set trap exceptions when the supervisor is not an Typed Actor")) - supervisorActor.trapExit = trapExceptions.toList - this - } - /** * Sets the fault handling strategy for the given supervisor Typed Actor. * @param supervisor the supervisor Typed Actor @@ -708,7 +695,7 @@ object TypedActor extends Logging { def faultHandler(supervisor: AnyRef, handler: FaultHandlingStrategy) = { val supervisorActor = actorFor(supervisor).getOrElse( throw new IllegalActorStateException("Can't set fault handler when the supervisor is not an Typed Actor")) - supervisorActor.faultHandler = Some(handler) + supervisorActor.faultHandler = handler this } diff --git a/akka-typed-actor/src/test/scala/actor/typed-actor/TypedActorLifecycleSpec.scala b/akka-typed-actor/src/test/scala/actor/typed-actor/TypedActorLifecycleSpec.scala index 781537d5a9..f2903adf03 100644 --- a/akka-typed-actor/src/test/scala/actor/typed-actor/TypedActorLifecycleSpec.scala +++ b/akka-typed-actor/src/test/scala/actor/typed-actor/TypedActorLifecycleSpec.scala @@ -87,7 +87,7 @@ class TypedActorLifecycleSpec extends Spec with ShouldMatchers with BeforeAndAft SamplePojoImpl.reset val pojo = TypedActor.newInstance(classOf[SimpleJavaPojo], classOf[SimpleJavaPojoImpl]) val supervisor = TypedActor.newInstance(classOf[SimpleJavaPojo], classOf[SimpleJavaPojoImpl]) - link(supervisor, pojo, OneForOneStrategy(3, 2000), Array(classOf[Throwable])) + link(supervisor, pojo, OneForOneStrategy(Array(classOf[Throwable]), 3, 2000)) pojo.throwException Thread.sleep(500) SimpleJavaPojoImpl._pre should be(true)