From c84daf83e801c25888906830243614625f989cfb Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 21 Feb 2012 16:40:34 +0100 Subject: [PATCH] clean up mailbox types configurability, see #1843 - add (config) constructors to std mailbox types - update docs for prio mailbox to directly implement MailboxType --- .../scala/akka/dispatch/AbstractDispatcher.scala | 10 ++++------ .../src/main/scala/akka/dispatch/Mailbox.scala | 7 +++++++ .../docs/dispatcher/DispatcherDocTestBase.java | 15 ++++++++++++--- .../akka/docs/dispatcher/DispatcherDocSpec.scala | 7 ++++++- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala index f6e3bf922c..631e84ece7 100644 --- a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala @@ -383,12 +383,10 @@ abstract class MessageDispatcherConfigurator(val config: Config, val prerequisit def mailboxType(): MailboxType = { config.getString("mailbox-type") match { case "" ⇒ - val capacity = config.getInt("mailbox-capacity") - if (capacity < 1) UnboundedMailbox() - else { - val duration = Duration(config.getNanoseconds("mailbox-push-timeout-time"), TimeUnit.NANOSECONDS) - BoundedMailbox(capacity, duration) - } + if (config.getInt("mailbox-capacity") < 1) UnboundedMailbox() + else new BoundedMailbox(config) + case "unbounded" ⇒ UnboundedMailbox() + case "bounded" ⇒ new BoundedMailbox(config) case fqcn ⇒ val args = Seq(classOf[Config] -> config) prerequisites.dynamicAccess.createInstanceFor[MailboxType](fqcn, args) match { diff --git a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala index f25c6571e8..3099fe8f01 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala @@ -11,6 +11,7 @@ import java.util.concurrent._ import annotation.tailrec import akka.event.Logging.Error import akka.actor.ActorContext +import com.typesafe.config.Config class MessageQueueAppendFailedException(message: String, cause: Throwable = null) extends AkkaException(message, cause) @@ -355,6 +356,9 @@ trait MailboxType { * It's a case class for Java (new UnboundedMailbox) */ case class UnboundedMailbox() extends MailboxType { + + def this(config: Config) = this() + final override def create(owner: Option[ActorContext]): MessageQueue = new QueueBasedMessageQueue with UnboundedMessageQueueSemantics { final val queue = new ConcurrentLinkedQueue[Envelope]() @@ -363,6 +367,9 @@ case class UnboundedMailbox() extends MailboxType { case class BoundedMailbox( final val capacity: Int, final val pushTimeOut: Duration) extends MailboxType { + def this(config: Config) = this(config.getInt("mailbox-capacity"), + Duration(config.getNanoseconds("mailbox-push-timeout-time"), TimeUnit.NANOSECONDS)) + if (capacity < 0) throw new IllegalArgumentException("The capacity for BoundedMailbox can not be negative") if (pushTimeOut eq null) throw new IllegalArgumentException("The push time-out for BoundedMailbox can not be null") diff --git a/akka-docs/java/code/akka/docs/dispatcher/DispatcherDocTestBase.java b/akka-docs/java/code/akka/docs/dispatcher/DispatcherDocTestBase.java index b1334bb9e5..d005ffcd6b 100644 --- a/akka-docs/java/code/akka/docs/dispatcher/DispatcherDocTestBase.java +++ b/akka-docs/java/code/akka/docs/dispatcher/DispatcherDocTestBase.java @@ -20,8 +20,11 @@ import akka.event.LoggingAdapter; //#imports-prio //#imports-prio-mailbox +import akka.actor.ActorContext; import akka.dispatch.PriorityGenerator; import akka.dispatch.UnboundedPriorityMailbox; +import akka.dispatch.MailboxType; +import akka.dispatch.MessageQueue; import com.typesafe.config.Config; //#imports-prio-mailbox @@ -120,7 +123,7 @@ public class DispatcherDocTestBase { } //#prio-mailbox - public static class PrioMailbox extends UnboundedPriorityMailbox { + public static class PrioMailbox implements MailboxType { static final PriorityGenerator generator = new PriorityGenerator() { // Create a new PriorityGenerator, lower prio means more important @Override @@ -135,9 +138,15 @@ public class DispatcherDocTestBase { return 50; // We default to 50 } }; + + private UnboundedPriorityMailbox priorityMailbox; - public PrioMailbox(Config config) { - super(generator); + public PrioMailbox(Config config) { // needed for reflective instantiation + priorityMailbox = new UnboundedPriorityMailbox(generator); + } + + public MessageQueue create(Option owner) { + return priorityMailbox.create(owner); } } //#prio-mailbox diff --git a/akka-docs/scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala b/akka-docs/scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala index 4de32c3b57..fe8eb8a270 100644 --- a/akka-docs/scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala +++ b/akka-docs/scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala @@ -108,6 +108,8 @@ object DispatcherDocSpec { //#prio-mailbox import akka.dispatch.PriorityGenerator import akka.dispatch.UnboundedPriorityMailbox + import akka.dispatch.MailboxType + import akka.actor.ActorContext import com.typesafe.config.Config val generator = PriorityGenerator { // Create a new PriorityGenerator, lower prio means more important @@ -118,7 +120,10 @@ object DispatcherDocSpec { } // We create a new Priority dispatcher and seed it with the priority generator - class PrioMailbox(config: Config) extends UnboundedPriorityMailbox(generator) + class PrioMailbox(config: Config) extends MailboxType { + val priorityMailbox = UnboundedPriorityMailbox(generator) + def create(owner: Option[ActorContext]) = priorityMailbox.create(owner) + } //#prio-mailbox class MyActor extends Actor {