diff --git a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala index 9940b16aa3..d9951c61e8 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala @@ -374,11 +374,23 @@ case class BoundedPriorityMailbox( final val cmp: Comparator[Envelope], final va } } +/** + * Mailbox factory that creates instantiates the implementation from a + * fully qualified class name. The implementation class must have + * a constructor with a [[akka.actor.ActorContext]] parameter. + * E.g. + * + * class MyMailbox(owner: ActorContext) extends CustomMailbox(owner) + * with QueueBasedMessageQueue with UnboundedMessageQueueSemantics with DefaultSystemMessageQueue { + * val queue = new ConcurrentLinkedQueue[Envelope]() + * } + * + */ class CustomMailboxType(mailboxFQN: String) extends MailboxType { override def create(receiver: ActorContext): Mailbox = { val constructorSignature = Array[Class[_]](classOf[ActorContext]) - ReflectiveAccess.createInstance[AnyRef](mailboxClass, constructorSignature, Array[AnyRef](receiver)) match { + ReflectiveAccess.createInstance[AnyRef](mailboxFQN, constructorSignature, Array[AnyRef](receiver)) match { case Right(instance) ⇒ instance.asInstanceOf[Mailbox] case Left(exception) ⇒ val cause = exception match { @@ -386,19 +398,9 @@ class CustomMailboxType(mailboxFQN: String) extends MailboxType { case _ ⇒ exception } throw new IllegalArgumentException("Cannot instantiate mailbox [%s] due to: %s". - format(mailboxClass.getName, cause.toString)) + format(mailboxFQN, cause.toString)) } } - private def mailboxClass: Class[_] = ReflectiveAccess.getClassFor(mailboxFQN, classOf[ActorContext].getClassLoader) match { - case Right(clazz) ⇒ clazz - case Left(exception) ⇒ - val cause = exception match { - case i: InvocationTargetException ⇒ i.getTargetException - case _ ⇒ exception - } - throw new IllegalArgumentException("Cannot find mailbox class [%s] due to: %s". - format(mailboxFQN, cause.toString)) - } } diff --git a/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocSpec.scala b/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocSpec.scala index 7140da03bb..863c48a15b 100644 --- a/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocSpec.scala +++ b/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocSpec.scala @@ -8,10 +8,6 @@ import akka.actor.Props //#imports -//#imports2 -import akka.actor.mailbox.FileDurableMailboxType -//#imports2 - import org.scalatest.{ BeforeAndAfterAll, WordSpec } import org.scalatest.matchers.MustMatchers import akka.testkit.AkkaSpec @@ -42,13 +38,4 @@ class DurableMailboxDocSpec extends AkkaSpec(DurableMailboxDocSpec.config) { //#dispatcher-config-use } - "programatically define dispatcher with durable mailbox" in { - //#prog-define-dispatcher - val dispatcher = system.dispatcherFactory.newDispatcher( - "my-dispatcher", throughput = 1, mailboxType = FileDurableMailboxType).build - val myActor = system.actorOf(Props[MyActor].withDispatcher(dispatcher)) - //#prog-define-dispatcher - myActor ! "hello" - } - } diff --git a/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocTestBase.java b/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocTestBase.java index 02066d8673..8b904f5ef6 100644 --- a/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocTestBase.java +++ b/akka-docs/modules/code/akka/docs/actor/mailbox/DurableMailboxDocTestBase.java @@ -11,16 +11,11 @@ import akka.actor.Props; //#imports -//#imports2 -import akka.actor.mailbox.DurableMailboxType; -//#imports2 - import org.junit.After; import org.junit.Before; import org.junit.Test; import akka.testkit.AkkaSpec; -import akka.docs.dispatcher.DispatcherDocSpec; import com.typesafe.config.ConfigFactory; import akka.actor.ActorRef; import akka.actor.ActorSystem; @@ -55,22 +50,9 @@ public class DurableMailboxDocTestBase { myActor.tell("test"); } - @Test - public void programaticallyDefinedDispatcher() { - //#prog-define-dispatcher - MessageDispatcher dispatcher = system.dispatcherFactory() - .newDispatcher("my-dispatcher", 1, DurableMailboxType.fileDurableMailboxType()).build(); - ActorRef myActor = system.actorOf(new Props().withDispatcher(dispatcher).withCreator(new UntypedActorFactory() { - public UntypedActor create() { - return new MyUntypedActor(); - } - }), "myactor"); - //#prog-define-dispatcher - myActor.tell("test"); - } - public static class MyUntypedActor extends UntypedActor { public void onReceive(Object message) { } } + } diff --git a/akka-durable-mailboxes/akka-beanstalk-mailbox/src/test/scala/akka/actor/mailbox/BeanstalkBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-beanstalk-mailbox/src/test/scala/akka/actor/mailbox/BeanstalkBasedMailboxSpec.scala index 88b1bf85ae..f011352d2b 100644 --- a/akka-durable-mailboxes/akka-beanstalk-mailbox/src/test/scala/akka/actor/mailbox/BeanstalkBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-beanstalk-mailbox/src/test/scala/akka/actor/mailbox/BeanstalkBasedMailboxSpec.scala @@ -1,4 +1,7 @@ package akka.actor.mailbox +import akka.dispatch.CustomMailboxType + @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class BeanstalkBasedMailboxSpec extends DurableMailboxSpec("Beanstalkd", BeanstalkDurableMailboxType) +class BeanstalkBasedMailboxSpec extends DurableMailboxSpec("Beanstalkd", + new CustomMailboxType("akka.actor.mailbox.BeanstalkBasedMailbox")) diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/FileBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/FileBasedMailboxSpec.scala index d1a36d14eb..43b8b2c048 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/FileBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/FileBasedMailboxSpec.scala @@ -1,9 +1,11 @@ package akka.actor.mailbox import org.apache.commons.io.FileUtils +import akka.dispatch.CustomMailboxType @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class FileBasedMailboxSpec extends DurableMailboxSpec("File", FileDurableMailboxType) { +class FileBasedMailboxSpec extends DurableMailboxSpec("File", + new CustomMailboxType("akka.actor.mailbox.FileBasedMailbox")) { def clean { val queuePath = FileBasedMailboxExtension(system).QueuePath diff --git a/akka-durable-mailboxes/akka-mailboxes-common/src/main/scala/akka/actor/mailbox/DurableMailbox.scala b/akka-durable-mailboxes/akka-mailboxes-common/src/main/scala/akka/actor/mailbox/DurableMailbox.scala index aa27a731e5..f94dfe83ca 100644 --- a/akka-durable-mailboxes/akka-mailboxes-common/src/main/scala/akka/actor/mailbox/DurableMailbox.scala +++ b/akka-durable-mailboxes/akka-mailboxes-common/src/main/scala/akka/actor/mailbox/DurableMailbox.scala @@ -74,23 +74,3 @@ trait DurableMessageSerialization { } -case object RedisDurableMailboxType extends CustomMailboxType("akka.actor.mailbox.RedisBasedMailbox") -case object MongoDurableMailboxType extends CustomMailboxType("akka.actor.mailbox.MongoBasedMailbox") -case object BeanstalkDurableMailboxType extends CustomMailboxType("akka.actor.mailbox.BeanstalkBasedMailbox") -case object FileDurableMailboxType extends CustomMailboxType("akka.actor.mailbox.FileBasedMailbox") -case object ZooKeeperDurableMailboxType extends CustomMailboxType("akka.actor.mailbox.ZooKeeperBasedMailbox") - -/** - * Java API for the mailbox types. Usage: - *

- * MessageDispatcher dispatcher = system.dispatcherFactory()
- *   .newDispatcher("my-dispatcher", 1, DurableMailboxType.redisDurableMailboxType()).build();
- * 
- */ -object DurableMailboxType { - def redisDurableMailboxType(): MailboxType = RedisDurableMailboxType - def mongoDurableMailboxType(): MailboxType = MongoDurableMailboxType - def beanstalkDurableMailboxType(): MailboxType = BeanstalkDurableMailboxType - def fileDurableMailboxType(): MailboxType = FileDurableMailboxType - def zooKeeperDurableMailboxType(): MailboxType = ZooKeeperDurableMailboxType -} diff --git a/akka-durable-mailboxes/akka-mongo-mailbox/src/test/scala/akka/actor/mailbox/MongoBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-mongo-mailbox/src/test/scala/akka/actor/mailbox/MongoBasedMailboxSpec.scala index ec13cff17f..4746a47242 100644 --- a/akka-durable-mailboxes/akka-mongo-mailbox/src/test/scala/akka/actor/mailbox/MongoBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-mongo-mailbox/src/test/scala/akka/actor/mailbox/MongoBasedMailboxSpec.scala @@ -1,18 +1,19 @@ package akka.actor.mailbox import java.util.concurrent.TimeUnit - import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers import org.scalatest.{ BeforeAndAfterEach, BeforeAndAfterAll } - import akka.actor._ import akka.actor.Actor._ import java.util.concurrent.CountDownLatch import akka.dispatch.MessageDispatcher +import akka.dispatch.CustomMailboxType @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MongoBasedMailboxSpec extends DurableMailboxSpec("mongodb", MongoDurableMailboxType) { +class MongoBasedMailboxSpec extends DurableMailboxSpec("mongodb", + new CustomMailboxType("akka.actor.mailbox.MongoBasedMailbox")) { + import org.apache.log4j.{ Logger, Level } import com.mongodb.async._ diff --git a/akka-durable-mailboxes/akka-redis-mailbox/src/test/scala/akka/actor/mailbox/RedisBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-redis-mailbox/src/test/scala/akka/actor/mailbox/RedisBasedMailboxSpec.scala index 8b8ea6d611..ecb700d383 100644 --- a/akka-durable-mailboxes/akka-redis-mailbox/src/test/scala/akka/actor/mailbox/RedisBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-redis-mailbox/src/test/scala/akka/actor/mailbox/RedisBasedMailboxSpec.scala @@ -1,4 +1,6 @@ package akka.actor.mailbox +import akka.dispatch.CustomMailboxType @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class RedisBasedMailboxSpec extends DurableMailboxSpec("Redis", RedisDurableMailboxType) +class RedisBasedMailboxSpec extends DurableMailboxSpec("Redis", + new CustomMailboxType("akka.actor.mailbox.RedisBasedMailbox")) diff --git a/akka-durable-mailboxes/akka-zookeeper-mailbox/src/test/scala/akka/actor/mailbox/ZooKeeperBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-zookeeper-mailbox/src/test/scala/akka/actor/mailbox/ZooKeeperBasedMailboxSpec.scala index 3cdc734830..888c46c1ea 100644 --- a/akka-durable-mailboxes/akka-zookeeper-mailbox/src/test/scala/akka/actor/mailbox/ZooKeeperBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-zookeeper-mailbox/src/test/scala/akka/actor/mailbox/ZooKeeperBasedMailboxSpec.scala @@ -4,10 +4,13 @@ import akka.actor.{ Actor, LocalActorRef } import akka.cluster.zookeeper._ import org.I0Itec.zkclient._ import akka.dispatch.MessageDispatcher +import akka.dispatch.CustomMailboxType import akka.actor.ActorRef @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class ZooKeeperBasedMailboxSpec extends DurableMailboxSpec("ZooKeeper", ZooKeeperDurableMailboxType) { +class ZooKeeperBasedMailboxSpec extends DurableMailboxSpec("ZooKeeper", + new CustomMailboxType("akka.actor.mailbox.ZooKeeperBasedMailbox")) { + val dataPath = "_akka_cluster/data" val logPath = "_akka_cluster/log"