From 88a9123724beae14dcfca39a254f84105b9d728e Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 20 Sep 2012 15:23:18 +0200 Subject: [PATCH 1/9] Move heartbeat-interval into failure-detector section --- .../src/main/resources/reference.conf | 6 +++--- .../scala/akka/cluster/ClusterSettings.scala | 2 +- .../akka/cluster/MultiNodeClusterSpec.scala | 20 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index fa6860a1a8..e2fe6cc8d1 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -36,9 +36,6 @@ akka { # how often should the node send out gossip information? gossip-interval = 1s - # how often should the node send out heartbeats? - heartbeat-interval = 1s - # how often should the leader perform maintenance tasks? leader-actions-interval = 1s @@ -76,6 +73,9 @@ akka { # akka.cluster.ClusterSettings parameters implementation-class = "akka.cluster.AccrualFailureDetector" + # how often should the node send out heartbeats? + heartbeat-interval = 1s + # defines the failure detector threshold # A low threshold is prone to generate many wrong suspicions but ensures # a quick detection in the event of a real crash. Conversely, a high diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index 4212e59c1c..3c7baa4f76 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -23,6 +23,7 @@ class ClusterSettings(val config: Config, val systemName: String) { Duration(getMilliseconds("akka.cluster.failure-detector.min-std-deviation"), MILLISECONDS) final val FailureDetectorAcceptableHeartbeatPause: FiniteDuration = Duration(getMilliseconds("akka.cluster.failure-detector.acceptable-heartbeat-pause"), MILLISECONDS) + final val HeartbeatInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.failure-detector.heartbeat-interval"), MILLISECONDS) final val SeedNodes: IndexedSeq[Address] = getStringList("akka.cluster.seed-nodes").asScala.map { case AddressFromURIString(addr) ⇒ addr @@ -30,7 +31,6 @@ class ClusterSettings(val config: Config, val systemName: String) { final val SeedNodeTimeout: FiniteDuration = Duration(getMilliseconds("akka.cluster.seed-node-timeout"), MILLISECONDS) final val PeriodicTasksInitialDelay: FiniteDuration = Duration(getMilliseconds("akka.cluster.periodic-tasks-initial-delay"), MILLISECONDS) final val GossipInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.gossip-interval"), MILLISECONDS) - final val HeartbeatInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.heartbeat-interval"), MILLISECONDS) final val LeaderActionsInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.leader-actions-interval"), MILLISECONDS) final val UnreachableNodesReaperInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.unreachable-nodes-reaper-interval"), MILLISECONDS) final val PublishStatsInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.publish-stats-interval"), MILLISECONDS) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index f38d80ace5..68ed7d91e7 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -8,7 +8,7 @@ import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import akka.actor.{ Address, ExtendedActorSystem } import akka.remote.testconductor.RoleName -import akka.remote.testkit.{STMultiNodeSpec, MultiNodeSpec} +import akka.remote.testkit.{ STMultiNodeSpec, MultiNodeSpec } import akka.testkit._ import scala.concurrent.util.duration._ import scala.concurrent.util.Duration @@ -31,15 +31,15 @@ object MultiNodeClusterSpec { def clusterConfig: Config = ConfigFactory.parseString(""" akka.actor.provider = akka.cluster.ClusterActorRefProvider akka.cluster { - auto-join = on - auto-down = off - jmx.enabled = off - gossip-interval = 200 ms - heartbeat-interval = 400 ms - leader-actions-interval = 200 ms - unreachable-nodes-reaper-interval = 200 ms - periodic-tasks-initial-delay = 300 ms - publish-stats-interval = 0 s # always, when it happens + auto-join = on + auto-down = off + jmx.enabled = off + gossip-interval = 200 ms + leader-actions-interval = 200 ms + unreachable-nodes-reaper-interval = 200 ms + periodic-tasks-initial-delay = 300 ms + publish-stats-interval = 0 s # always, when it happens + failure-detector.heartbeat-interval = 400 ms } akka.remote.log-remote-lifecycle-events = off akka.test { From 5017ba1fda6cbb5b864b743eae66c37b0db64a48 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 20 Sep 2012 15:24:07 +0200 Subject: [PATCH 2/9] Describe cluster failure detector and phi, see #2251 --- akka-docs/cluster/cluster-usage.rst | 40 ++++++++++++++++++++++++++++ akka-docs/cluster/images/phi1.png | Bin 0 -> 26426 bytes akka-docs/cluster/images/phi2.png | Bin 0 -> 25535 bytes akka-docs/cluster/images/phi3.png | Bin 0 -> 26430 bytes 4 files changed, 40 insertions(+) create mode 100644 akka-docs/cluster/images/phi1.png create mode 100644 akka-docs/cluster/images/phi2.png create mode 100644 akka-docs/cluster/images/phi3.png diff --git a/akka-docs/cluster/cluster-usage.rst b/akka-docs/cluster/cluster-usage.rst index b0ec8f08b7..2848291a32 100644 --- a/akka-docs/cluster/cluster-usage.rst +++ b/akka-docs/cluster/cluster-usage.rst @@ -212,6 +212,46 @@ frontend nodes and 3 backend nodes:: .. note:: The above example should probably be designed as two separate, frontend/backend, clusters, when there is a `cluster client for decoupling clusters `_. +Failure Detector +^^^^^^^^^^^^^^^^ + +The nodes in the cluster monitor each other by sending heartbeats to detect if a node is +unreachable from the rest of the cluster. The heartbeat arrival times is interpreted +by an implementation of +`The Phi Accrual Failure Detector `_. +It calculates a *phi* value representing the likelihood that the node is down. + +In the :ref:`cluster_configuration` you can adjust the ``akka.cluster.failure-detector.threshold`` +to define when a *phi* value is to be considered as a failure. +A low ``threshold`` is prone to generate many wrong suspicions but ensures +a quick detection in the event of a real crash. Conversely, a high ``threshold`` +generates fewer mistakes but needs more time to detect actual crashes. The +default ``threshold`` is 8 and is appropriate for most situations. However in +cloud environments, such as Amazon EC2, the value could be increased to 12 in +order to account for network issues that sometimes occur on such platforms. + +The following chart illustrates how *phi* increase with increasing time since previous +heartbeat. + +.. image:: images/phi1.png + +Phi is calculated from the mean and standard deviation of historical +inter arrival times. The previous chart is an example for standard deviation +of 200 ms. If the heartbeats arrive with less deviation the curve becomes steeper, +i.e. it's possible to determine failure more quickly. The curve looks like this for +standard deviation of 100 ms. + +.. image:: images/phi2.png + +To be able to survive sudden abnormalities, such as garbage collection pauses and +transient network failures the failure detector is configured with a margin, +``akka.cluster.failure-detector.acceptable-heartbeat-pause``. You may want to +adjust the :ref:`cluster_configuration` of this depending on you environment. +This is how the curve looks like for ``acceptable-heartbeat-pause`` configured to +3 seconds. + +.. image:: images/phi3.png + Cluster Aware Routers ^^^^^^^^^^^^^^^^^^^^^ diff --git a/akka-docs/cluster/images/phi1.png b/akka-docs/cluster/images/phi1.png new file mode 100644 index 0000000000000000000000000000000000000000..104068ec5496dc8f079def4deaccb9d7c5fff7a6 GIT binary patch literal 26426 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 literal 0 HcmV?d00001 diff --git a/akka-docs/cluster/images/phi2.png b/akka-docs/cluster/images/phi2.png new file mode 100644 index 0000000000000000000000000000000000000000..af2e7569910466d3add52f02106253a86fe94a14 GIT binary patch literal 25535 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 literal 0 HcmV?d00001 diff --git a/akka-docs/cluster/images/phi3.png b/akka-docs/cluster/images/phi3.png new file mode 100644 index 0000000000000000000000000000000000000000..bda3c5d345df4c81785524bea99cab95dc62a430 GIT binary patch literal 26430 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 MUHx3vIVCg!02?1;EC2ui literal 0 HcmV?d00001 From 9bc01ae265065f80cd8bcc1cb38a0f0a657d30bc Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 21 Sep 2012 10:47:58 +0200 Subject: [PATCH 3/9] add preprocessor for RST docs, see #2461 and #2431 The idea is to filter the sources, replacing @@ occurrences with the mapping for (which is currently hard-coded). @@ -> @. In order to make this work, I had to move the doc sources one directory down (into akka-docs/rst) so that the filtered result could be in a sibling directory so that relative links (to _sphinx plugins or real code) would continue to work. While I was at it I also changed it so that WARNINGs and ERRORs are not swallowed into the debug dump anymore but printed at [warn] level (minimum). One piece of fallout is that the (online) html build is now run after the normal one, not in parallel. --- .gitignore | 3 +- akka-docs/more.png | Bin 1502 -> 0 bytes .../additional/code/osgi/Activator.scala | 0 .../additional/code/osgi/blueprint.xml | 0 akka-docs/{ => rst}/additional/index.rst | 0 .../additional/language-bindings.rst | 0 akka-docs/{ => rst}/additional/osgi.rst | 0 akka-docs/{ => rst}/additional/recipes.rst | 0 akka-docs/{ => rst}/cluster/cluster-usage.rst | 50 +++++----- akka-docs/{ => rst}/cluster/cluster.rst | 0 .../cluster/images/member-states.png | Bin akka-docs/{ => rst}/cluster/images/more.png | Bin akka-docs/{ => rst}/cluster/index.rst | 0 akka-docs/{ => rst}/common/circuitbreaker.rst | 0 .../CircuitBreakerDocSpec.scala | 0 .../circuitbreaker/DangerousJavaActor.java | 0 .../common/code/docs/duration/Java.java | 0 .../common/code/docs/duration/Sample.scala | 0 akka-docs/{ => rst}/common/duration.rst | 0 akka-docs/{ => rst}/common/index.rst | 0 akka-docs/{ => rst}/conf.py | 20 ++-- akka-docs/{ => rst}/dev/building-akka.rst | 0 .../{ => rst}/dev/developer-guidelines.rst | 0 akka-docs/{ => rst}/dev/documentation.rst | 0 akka-docs/{ => rst}/dev/index.rst | 0 akka-docs/{ => rst}/dev/multi-jvm-testing.rst | 4 +- akka-docs/{ => rst}/dev/team.rst | 0 akka-docs/{ => rst}/experimental/index.rst | 0 akka-docs/{ => rst}/general/ActorPath.png | Bin .../{ => rst}/general/RemoteDeployment.png | Bin akka-docs/{ => rst}/general/actor-systems.rst | 0 akka-docs/{ => rst}/general/actors.rst | 0 akka-docs/{ => rst}/general/addressing.rst | 0 .../general/code/docs/config/ConfigDoc.java | 0 .../code/docs/config/ConfigDocSpec.scala | 0 akka-docs/{ => rst}/general/configuration.rst | 16 ++-- akka-docs/{ => rst}/general/guardians.png | Bin akka-docs/{ => rst}/general/index.rst | 0 akka-docs/{ => rst}/general/jmm.rst | 0 .../general/message-send-semantics.rst | 0 akka-docs/{ => rst}/general/remoting.rst | 0 akka-docs/{ => rst}/general/supervision.rst | 0 .../images/akka-remote-testconductor.png | Bin ...nchmark-akka-sample-trading-throughput.png | Bin akka-docs/{ => rst}/images/build-path.png | Bin .../images/circuit-breaker-states.dot | 0 .../images/circuit-breaker-states.png | Bin akka-docs/{ => rst}/images/clojure-trees.png | Bin .../{ => rst}/images/diagnostics-window.png | Bin akka-docs/{ => rst}/images/example-code.png | Bin .../faulttolerancesample-failure-flow.png | Bin .../faulttolerancesample-normal-flow.png | Bin .../images/faulttolerancesample.graffle | 0 akka-docs/{ => rst}/images/import-project.png | Bin .../images/install-beta2-updatesite.png | Bin akka-docs/{ => rst}/images/pi-formula.png | Bin akka-docs/{ => rst}/images/quickfix.png | Bin akka-docs/{ => rst}/images/run-config.png | Bin akka-docs/{ => rst}/index.rst | 0 .../{ => rst}/intro/deployment-scenarios.rst | 0 akka-docs/{ => rst}/intro/getting-started.rst | 51 +++++----- akka-docs/{ => rst}/intro/index.rst | 0 akka-docs/{ => rst}/intro/use-cases.rst | 0 akka-docs/{ => rst}/intro/what-is-akka.rst | 0 akka-docs/{ => rst}/intro/why-akka.rst | 0 akka-docs/{ => rst}/java/agents.rst | 0 akka-docs/{ => rst}/java/camel.rst | 0 .../java/code/docs/actor/FSMDocTest.scala | 0 .../java/code/docs/actor/FSMDocTestBase.java | 0 .../code/docs/actor/FaultHandlingTest.scala | 0 .../docs/actor/FaultHandlingTestBase.java | 0 .../code/docs/actor/FirstUntypedActor.java | 0 .../code/docs/actor/ImmutableMessage.java | 0 .../actor/MyReceivedTimeoutUntypedActor.java | 0 .../java/code/docs/actor/MyUntypedActor.java | 0 .../code/docs/actor/SchedulerDocTest.scala | 0 .../code/docs/actor/SchedulerDocTestBase.java | 0 .../code/docs/actor/TypedActorDocTest.scala | 0 .../docs/actor/TypedActorDocTestBase.java | 0 .../code/docs/actor/UntypedActorDocTest.scala | 0 .../docs/actor/UntypedActorDocTestBase.java | 0 .../code/docs/actor/UntypedActorSwapper.java | 0 .../actor/japi/FaultHandlingDocSample.java | 0 .../code/docs/agent/AgentDocJavaSpec.scala | 0 .../java/code/docs/agent/AgentDocTest.java | 0 .../code/docs/camel/ActivationTestBase.java | 0 .../docs/camel/CamelExtensionDocTest.scala | 0 .../docs/camel/CamelExtensionTestBase.java | 0 .../java/code/docs/camel/Consumer1.java | 0 .../java/code/docs/camel/Consumer2.java | 0 .../java/code/docs/camel/Consumer3.java | 0 .../java/code/docs/camel/Consumer4.java | 0 .../code/docs/camel/CustomRouteBuilder.java | 0 .../code/docs/camel/CustomRouteTestBase.java | 0 .../docs/camel/ErrorThrowingConsumer.java | 0 .../java/code/docs/camel/FirstProducer.java | 0 .../java/code/docs/camel/Forwarder.java | 0 .../java/code/docs/camel/MyActor.java | 0 .../java/code/docs/camel/MyEndpoint.java | 0 .../docs/camel/OnRouteResponseTestBase.java | 0 .../java/code/docs/camel/OnewaySender.java | 0 .../java/code/docs/camel/Orders.java | 0 .../java/code/docs/camel/Producer1.java | 0 .../code/docs/camel/ProducerTestBase.java | 0 .../code/docs/camel/RequestBodyActor.java | 0 .../java/code/docs/camel/Responder.java | 0 .../code/docs/camel/ResponseReceiver.java | 0 .../java/code/docs/camel/Transformer.java | 0 .../docs/camel/sample/http/HttpConsumer.java | 0 .../docs/camel/sample/http/HttpProducer.java | 0 .../docs/camel/sample/http/HttpSample.java | 0 .../camel/sample/http/HttpTransformer.java | 0 .../camel/sample/quartz/MyQuartzActor.java | 0 .../camel/sample/quartz/QuartzSample.java | 0 .../docs/camel/sample/route/Consumer3.java | 0 .../sample/route/CustomRouteBuilder.java | 0 .../camel/sample/route/CustomRouteSample.java | 0 .../docs/camel/sample/route/Producer1.java | 0 .../docs/camel/sample/route/Transformer.java | 0 .../docs/dispatcher/DispatcherDocTest.scala | 0 .../dispatcher/DispatcherDocTestBase.java | 0 .../java/code/docs/event/LoggingDocTest.scala | 0 .../code/docs/event/LoggingDocTestBase.java | 0 .../docs/extension/ExtensionDocTest.scala | 0 .../docs/extension/ExtensionDocTestBase.java | 0 .../extension/SettingsExtensionDocTest.scala | 0 .../SettingsExtensionDocTestBase.java | 0 .../java/code/docs/future/FutureDocTest.scala | 0 .../code/docs/future/FutureDocTestBase.java | 0 .../ConsistentHashingRouterDocTest.scala | 0 .../ConsistentHashingRouterDocTestBase.java | 0 .../docs/jrouting/CustomRouterDocTest.scala | 0 .../jrouting/CustomRouterDocTestBase.java | 0 .../code/docs/jrouting/FibonacciActor.java | 0 .../java/code/docs/jrouting/ParentActor.java | 0 .../java/code/docs/jrouting/PrintlnActor.java | 0 .../docs/jrouting/RouterViaConfigExample.java | 0 .../jrouting/RouterViaProgramExample.java | 0 .../java/code/docs/pattern/JavaTemplate.java | 0 .../docs/remoting/RemoteActorExample.java | 0 .../remoting/RemoteDeploymentDocTest.scala | 0 .../remoting/RemoteDeploymentDocTestBase.java | 0 .../serialization/SerializationDocTest.scala | 0 .../SerializationDocTestBase.java | 0 .../code/docs/testkit/TestKitDocTest.java | 0 .../code/docs/testkit/TestKitSampleTest.java | 0 .../docs/transactor/CoordinatedCounter.java | 0 .../code/docs/transactor/Coordinator.java | 0 .../java/code/docs/transactor/Counter.java | 0 .../code/docs/transactor/FriendlyCounter.java | 0 .../java/code/docs/transactor/Increment.java | 0 .../java/code/docs/transactor/Message.java | 0 .../transactor/TransactorDocJavaSpec.scala | 0 .../docs/transactor/TransactorDocTest.java | 0 .../java/code/docs/zeromq/ZeromqDocTest.scala | 0 .../code/docs/zeromq/ZeromqDocTestBase.java | 0 akka-docs/{ => rst}/java/dispatchers.rst | 0 akka-docs/{ => rst}/java/event-bus.rst | 0 akka-docs/{ => rst}/java/extending-akka.rst | 0 .../{ => rst}/java/fault-tolerance-sample.rst | 0 akka-docs/{ => rst}/java/fault-tolerance.rst | 0 akka-docs/{ => rst}/java/fsm.rst | 0 akka-docs/{ => rst}/java/futures.rst | 0 akka-docs/{ => rst}/java/howto.rst | 0 akka-docs/{ => rst}/java/index.rst | 0 akka-docs/{ => rst}/java/logging.rst | 0 akka-docs/{ => rst}/java/microkernel.rst | 6 +- akka-docs/{ => rst}/java/remoting.rst | 32 +++---- akka-docs/{ => rst}/java/routing.rst | 0 akka-docs/{ => rst}/java/scheduler.rst | 6 +- akka-docs/{ => rst}/java/serialization.rst | 0 akka-docs/{ => rst}/java/stm.rst | 0 akka-docs/{ => rst}/java/testing.rst | 0 akka-docs/{ => rst}/java/transactors.rst | 0 akka-docs/{ => rst}/java/typed-actors.rst | 0 akka-docs/{ => rst}/java/untyped-actors.rst | 0 akka-docs/{ => rst}/java/zeromq.rst | 0 .../modules/camel-async-interact.png | Bin .../modules/camel-async-sequence.png | Bin .../{ => rst}/modules/camel-custom-route.png | Bin akka-docs/{ => rst}/modules/camel-pubsub.png | Bin akka-docs/{ => rst}/modules/camel-pubsub2.png | Bin akka-docs/{ => rst}/modules/camel.rst | 0 .../actor/mailbox/DurableMailboxDocSpec.scala | 0 .../actor/mailbox/DurableMailboxDocTest.scala | 0 .../mailbox/DurableMailboxDocTestBase.java | 0 .../{ => rst}/modules/durable-mailbox.rst | 2 +- akka-docs/{ => rst}/modules/http.rst | 0 akka-docs/{ => rst}/modules/index.rst | 0 akka-docs/{ => rst}/project/index.rst | 0 .../{ => rst}/project/issue-tracking.rst | 0 akka-docs/{ => rst}/project/licenses.rst | 0 akka-docs/{ => rst}/project/links.rst | 6 +- .../project/migration-guide-1.3.x-2.0.x.rst | 0 .../project/migration-guide-2.0.x-2.1.x.rst | 6 +- .../{ => rst}/project/migration-guides.rst | 0 akka-docs/{ => rst}/project/other-doc.rst | 0 akka-docs/{ => rst}/project/release-notes.rst | 0 akka-docs/{ => rst}/project/scaladoc.rst | 0 akka-docs/{ => rst}/project/sponsors.rst | 0 akka-docs/{ => rst}/scala/actors.rst | 0 akka-docs/{ => rst}/scala/agents.rst | 0 akka-docs/{ => rst}/scala/camel.rst | 0 .../scala/code/docs/actor/ActorDocSpec.scala | 0 .../scala/code/docs/actor/FSMDocSpec.scala | 0 .../docs/actor/FaultHandlingDocSample.scala | 0 .../docs/actor/FaultHandlingDocSpec.scala | 0 .../code/docs/actor/SchedulerDocSpec.scala | 0 .../code/docs/actor/TypedActorDocSpec.scala | 0 .../code/docs/actor/UnnestedReceives.scala | 0 .../scala/code/docs/agent/AgentDocSpec.scala | 0 .../scala/code/docs/camel/Consumers.scala | 0 .../scala/code/docs/camel/CustomRoute.scala | 0 .../code/docs/camel/CustomRouteExample.scala | 0 .../scala/code/docs/camel/HttpExample.scala | 0 .../scala/code/docs/camel/Introduction.scala | 0 .../scala/code/docs/camel/Producers.scala | 0 .../code/docs/camel/PublishSubscribe.scala | 0 .../scala/code/docs/camel/QuartzExample.scala | 0 .../code/docs/dataflow/DataflowDocSpec.scala | 0 .../docs/dispatcher/DispatcherDocSpec.scala | 0 .../code/docs/event/LoggingDocSpec.scala | 0 .../docs/extension/ExtensionDocSpec.scala | 0 .../extension/SettingsExtensionDocSpec.scala | 0 .../code/docs/future/FutureDocSpec.scala | 0 .../scala/code/docs/io/BinaryCoding.scala | 0 .../scala/code/docs/io/HTTPServer.scala | 0 .../code/docs/pattern/ScalaTemplate.scala | 0 .../remoting/RemoteDeploymentDocSpec.scala | 0 .../ConsistentHashingRouterDocSpec.scala | 0 .../code/docs/routing/RouterDocSpec.scala | 0 .../code/docs/routing/RouterTypeExample.scala | 0 .../docs/routing/RouterViaConfigDocSpec.scala | 0 .../docs/routing/RouterViaConfigExample.scala | 52 +++++++++++ .../routing/RouterViaProgramExample.scala | 0 .../serialization/SerializationDocSpec.scala | 0 .../code/docs/testkit/PlainWordSpec.scala | 0 .../code/docs/testkit/TestKitUsageSpec.scala | 0 .../code/docs/testkit/TestkitDocSpec.scala | 0 .../docs/transactor/TransactorDocSpec.scala | 0 .../code/docs/zeromq/ZeromqDocSpec.scala | 0 akka-docs/{ => rst}/scala/dataflow.rst | 5 +- akka-docs/{ => rst}/scala/dispatchers.rst | 0 akka-docs/{ => rst}/scala/event-bus.rst | 0 akka-docs/{ => rst}/scala/extending-akka.rst | 0 .../scala/fault-tolerance-sample.rst | 0 akka-docs/{ => rst}/scala/fault-tolerance.rst | 0 akka-docs/{ => rst}/scala/fsm.rst | 0 akka-docs/{ => rst}/scala/futures.rst | 0 akka-docs/{ => rst}/scala/howto.rst | 16 ++-- akka-docs/{ => rst}/scala/index.rst | 0 akka-docs/{ => rst}/scala/io.rst | 0 akka-docs/{ => rst}/scala/logging.rst | 0 akka-docs/{ => rst}/scala/microkernel.rst | 6 +- akka-docs/{ => rst}/scala/remoting.rst | 28 +++--- akka-docs/{ => rst}/scala/routing.rst | 12 +-- akka-docs/{ => rst}/scala/scheduler.rst | 6 +- akka-docs/{ => rst}/scala/serialization.rst | 0 akka-docs/{ => rst}/scala/stm.rst | 0 akka-docs/{ => rst}/scala/testing.rst | 6 +- akka-docs/{ => rst}/scala/testkit-example.rst | 0 akka-docs/{ => rst}/scala/transactors.rst | 0 akka-docs/{ => rst}/scala/typed-actors.rst | 0 akka-docs/{ => rst}/scala/zeromq.rst | 0 project/AkkaBuild.scala | 32 ++++++- project/Sphinx.scala | 87 +++++++++++------- 266 files changed, 270 insertions(+), 182 deletions(-) delete mode 100644 akka-docs/more.png rename akka-docs/{ => rst}/additional/code/osgi/Activator.scala (100%) rename akka-docs/{ => rst}/additional/code/osgi/blueprint.xml (100%) rename akka-docs/{ => rst}/additional/index.rst (100%) rename akka-docs/{ => rst}/additional/language-bindings.rst (100%) rename akka-docs/{ => rst}/additional/osgi.rst (100%) rename akka-docs/{ => rst}/additional/recipes.rst (100%) rename akka-docs/{ => rst}/cluster/cluster-usage.rst (85%) rename akka-docs/{ => rst}/cluster/cluster.rst (100%) rename akka-docs/{ => rst}/cluster/images/member-states.png (100%) rename akka-docs/{ => rst}/cluster/images/more.png (100%) rename akka-docs/{ => rst}/cluster/index.rst (100%) rename akka-docs/{ => rst}/common/circuitbreaker.rst (100%) rename akka-docs/{ => rst}/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala (100%) rename akka-docs/{ => rst}/common/code/docs/circuitbreaker/DangerousJavaActor.java (100%) rename akka-docs/{ => rst}/common/code/docs/duration/Java.java (100%) rename akka-docs/{ => rst}/common/code/docs/duration/Sample.scala (100%) rename akka-docs/{ => rst}/common/duration.rst (100%) rename akka-docs/{ => rst}/common/index.rst (100%) rename akka-docs/{ => rst}/conf.py (83%) rename akka-docs/{ => rst}/dev/building-akka.rst (100%) rename akka-docs/{ => rst}/dev/developer-guidelines.rst (100%) rename akka-docs/{ => rst}/dev/documentation.rst (100%) rename akka-docs/{ => rst}/dev/index.rst (100%) rename akka-docs/{ => rst}/dev/multi-jvm-testing.rst (98%) rename akka-docs/{ => rst}/dev/team.rst (100%) rename akka-docs/{ => rst}/experimental/index.rst (100%) rename akka-docs/{ => rst}/general/ActorPath.png (100%) rename akka-docs/{ => rst}/general/RemoteDeployment.png (100%) rename akka-docs/{ => rst}/general/actor-systems.rst (100%) rename akka-docs/{ => rst}/general/actors.rst (100%) rename akka-docs/{ => rst}/general/addressing.rst (100%) rename akka-docs/{ => rst}/general/code/docs/config/ConfigDoc.java (100%) rename akka-docs/{ => rst}/general/code/docs/config/ConfigDocSpec.scala (100%) rename akka-docs/{ => rst}/general/configuration.rst (95%) rename akka-docs/{ => rst}/general/guardians.png (100%) rename akka-docs/{ => rst}/general/index.rst (100%) rename akka-docs/{ => rst}/general/jmm.rst (100%) rename akka-docs/{ => rst}/general/message-send-semantics.rst (100%) rename akka-docs/{ => rst}/general/remoting.rst (100%) rename akka-docs/{ => rst}/general/supervision.rst (100%) rename akka-docs/{ => rst}/images/akka-remote-testconductor.png (100%) rename akka-docs/{ => rst}/images/benchmark-akka-sample-trading-throughput.png (100%) rename akka-docs/{ => rst}/images/build-path.png (100%) rename akka-docs/{ => rst}/images/circuit-breaker-states.dot (100%) rename akka-docs/{ => rst}/images/circuit-breaker-states.png (100%) rename akka-docs/{ => rst}/images/clojure-trees.png (100%) rename akka-docs/{ => rst}/images/diagnostics-window.png (100%) rename akka-docs/{ => rst}/images/example-code.png (100%) rename akka-docs/{ => rst}/images/faulttolerancesample-failure-flow.png (100%) rename akka-docs/{ => rst}/images/faulttolerancesample-normal-flow.png (100%) rename akka-docs/{ => rst}/images/faulttolerancesample.graffle (100%) rename akka-docs/{ => rst}/images/import-project.png (100%) rename akka-docs/{ => rst}/images/install-beta2-updatesite.png (100%) rename akka-docs/{ => rst}/images/pi-formula.png (100%) rename akka-docs/{ => rst}/images/quickfix.png (100%) rename akka-docs/{ => rst}/images/run-config.png (100%) rename akka-docs/{ => rst}/index.rst (100%) rename akka-docs/{ => rst}/intro/deployment-scenarios.rst (100%) rename akka-docs/{ => rst}/intro/getting-started.rst (76%) rename akka-docs/{ => rst}/intro/index.rst (100%) rename akka-docs/{ => rst}/intro/use-cases.rst (100%) rename akka-docs/{ => rst}/intro/what-is-akka.rst (100%) rename akka-docs/{ => rst}/intro/why-akka.rst (100%) rename akka-docs/{ => rst}/java/agents.rst (100%) rename akka-docs/{ => rst}/java/camel.rst (100%) rename akka-docs/{ => rst}/java/code/docs/actor/FSMDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/actor/FSMDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/FaultHandlingTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/actor/FaultHandlingTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/FirstUntypedActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/ImmutableMessage.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/MyUntypedActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/SchedulerDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/actor/SchedulerDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/TypedActorDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/actor/TypedActorDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/UntypedActorDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/actor/UntypedActorDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/UntypedActorSwapper.java (100%) rename akka-docs/{ => rst}/java/code/docs/actor/japi/FaultHandlingDocSample.java (100%) rename akka-docs/{ => rst}/java/code/docs/agent/AgentDocJavaSpec.scala (100%) rename akka-docs/{ => rst}/java/code/docs/agent/AgentDocTest.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/ActivationTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/CamelExtensionDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/camel/CamelExtensionTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Consumer1.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Consumer2.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Consumer3.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Consumer4.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/CustomRouteBuilder.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/CustomRouteTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/ErrorThrowingConsumer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/FirstProducer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Forwarder.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/MyActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/MyEndpoint.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/OnRouteResponseTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/OnewaySender.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Orders.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Producer1.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/ProducerTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/RequestBodyActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Responder.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/ResponseReceiver.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/Transformer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/http/HttpConsumer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/http/HttpProducer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/http/HttpSample.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/http/HttpTransformer.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/quartz/MyQuartzActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/quartz/QuartzSample.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/route/Consumer3.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/route/CustomRouteBuilder.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/route/CustomRouteSample.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/route/Producer1.java (100%) rename akka-docs/{ => rst}/java/code/docs/camel/sample/route/Transformer.java (100%) rename akka-docs/{ => rst}/java/code/docs/dispatcher/DispatcherDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/dispatcher/DispatcherDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/event/LoggingDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/event/LoggingDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/extension/ExtensionDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/extension/ExtensionDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/extension/SettingsExtensionDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/extension/SettingsExtensionDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/future/FutureDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/future/FutureDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/ConsistentHashingRouterDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/ConsistentHashingRouterDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/CustomRouterDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/CustomRouterDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/FibonacciActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/ParentActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/PrintlnActor.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/RouterViaConfigExample.java (100%) rename akka-docs/{ => rst}/java/code/docs/jrouting/RouterViaProgramExample.java (100%) rename akka-docs/{ => rst}/java/code/docs/pattern/JavaTemplate.java (100%) rename akka-docs/{ => rst}/java/code/docs/remoting/RemoteActorExample.java (100%) rename akka-docs/{ => rst}/java/code/docs/remoting/RemoteDeploymentDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/remoting/RemoteDeploymentDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/serialization/SerializationDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/serialization/SerializationDocTestBase.java (100%) rename akka-docs/{ => rst}/java/code/docs/testkit/TestKitDocTest.java (100%) rename akka-docs/{ => rst}/java/code/docs/testkit/TestKitSampleTest.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/CoordinatedCounter.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/Coordinator.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/Counter.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/FriendlyCounter.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/Increment.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/Message.java (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/TransactorDocJavaSpec.scala (100%) rename akka-docs/{ => rst}/java/code/docs/transactor/TransactorDocTest.java (100%) rename akka-docs/{ => rst}/java/code/docs/zeromq/ZeromqDocTest.scala (100%) rename akka-docs/{ => rst}/java/code/docs/zeromq/ZeromqDocTestBase.java (100%) rename akka-docs/{ => rst}/java/dispatchers.rst (100%) rename akka-docs/{ => rst}/java/event-bus.rst (100%) rename akka-docs/{ => rst}/java/extending-akka.rst (100%) rename akka-docs/{ => rst}/java/fault-tolerance-sample.rst (100%) rename akka-docs/{ => rst}/java/fault-tolerance.rst (100%) rename akka-docs/{ => rst}/java/fsm.rst (100%) rename akka-docs/{ => rst}/java/futures.rst (100%) rename akka-docs/{ => rst}/java/howto.rst (100%) rename akka-docs/{ => rst}/java/index.rst (100%) rename akka-docs/{ => rst}/java/logging.rst (100%) rename akka-docs/{ => rst}/java/microkernel.rst (90%) rename akka-docs/{ => rst}/java/remoting.rst (89%) rename akka-docs/{ => rst}/java/routing.rst (100%) rename akka-docs/{ => rst}/java/scheduler.rst (89%) rename akka-docs/{ => rst}/java/serialization.rst (100%) rename akka-docs/{ => rst}/java/stm.rst (100%) rename akka-docs/{ => rst}/java/testing.rst (100%) rename akka-docs/{ => rst}/java/transactors.rst (100%) rename akka-docs/{ => rst}/java/typed-actors.rst (100%) rename akka-docs/{ => rst}/java/untyped-actors.rst (100%) rename akka-docs/{ => rst}/java/zeromq.rst (100%) rename akka-docs/{ => rst}/modules/camel-async-interact.png (100%) rename akka-docs/{ => rst}/modules/camel-async-sequence.png (100%) rename akka-docs/{ => rst}/modules/camel-custom-route.png (100%) rename akka-docs/{ => rst}/modules/camel-pubsub.png (100%) rename akka-docs/{ => rst}/modules/camel-pubsub2.png (100%) rename akka-docs/{ => rst}/modules/camel.rst (100%) rename akka-docs/{ => rst}/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala (100%) rename akka-docs/{ => rst}/modules/code/docs/actor/mailbox/DurableMailboxDocTest.scala (100%) rename akka-docs/{ => rst}/modules/code/docs/actor/mailbox/DurableMailboxDocTestBase.java (100%) rename akka-docs/{ => rst}/modules/durable-mailbox.rst (97%) rename akka-docs/{ => rst}/modules/http.rst (100%) rename akka-docs/{ => rst}/modules/index.rst (100%) rename akka-docs/{ => rst}/project/index.rst (100%) rename akka-docs/{ => rst}/project/issue-tracking.rst (100%) rename akka-docs/{ => rst}/project/licenses.rst (100%) rename akka-docs/{ => rst}/project/links.rst (90%) rename akka-docs/{ => rst}/project/migration-guide-1.3.x-2.0.x.rst (100%) rename akka-docs/{ => rst}/project/migration-guide-2.0.x-2.1.x.rst (99%) rename akka-docs/{ => rst}/project/migration-guides.rst (100%) rename akka-docs/{ => rst}/project/other-doc.rst (100%) rename akka-docs/{ => rst}/project/release-notes.rst (100%) rename akka-docs/{ => rst}/project/scaladoc.rst (100%) rename akka-docs/{ => rst}/project/sponsors.rst (100%) rename akka-docs/{ => rst}/scala/actors.rst (100%) rename akka-docs/{ => rst}/scala/agents.rst (100%) rename akka-docs/{ => rst}/scala/camel.rst (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/ActorDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/FSMDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/FaultHandlingDocSample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/FaultHandlingDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/SchedulerDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/TypedActorDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/actor/UnnestedReceives.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/agent/AgentDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/Consumers.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/CustomRoute.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/CustomRouteExample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/HttpExample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/Introduction.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/Producers.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/PublishSubscribe.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/camel/QuartzExample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/dataflow/DataflowDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/dispatcher/DispatcherDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/event/LoggingDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/extension/ExtensionDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/extension/SettingsExtensionDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/future/FutureDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/io/BinaryCoding.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/io/HTTPServer.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/pattern/ScalaTemplate.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/remoting/RemoteDeploymentDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/routing/ConsistentHashingRouterDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/routing/RouterDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/routing/RouterTypeExample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/routing/RouterViaConfigDocSpec.scala (100%) create mode 100644 akka-docs/rst/scala/code/docs/routing/RouterViaConfigExample.scala rename akka-docs/{ => rst}/scala/code/docs/routing/RouterViaProgramExample.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/serialization/SerializationDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/testkit/PlainWordSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/testkit/TestKitUsageSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/testkit/TestkitDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/transactor/TransactorDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/code/docs/zeromq/ZeromqDocSpec.scala (100%) rename akka-docs/{ => rst}/scala/dataflow.rst (97%) rename akka-docs/{ => rst}/scala/dispatchers.rst (100%) rename akka-docs/{ => rst}/scala/event-bus.rst (100%) rename akka-docs/{ => rst}/scala/extending-akka.rst (100%) rename akka-docs/{ => rst}/scala/fault-tolerance-sample.rst (100%) rename akka-docs/{ => rst}/scala/fault-tolerance.rst (100%) rename akka-docs/{ => rst}/scala/fsm.rst (100%) rename akka-docs/{ => rst}/scala/futures.rst (100%) rename akka-docs/{ => rst}/scala/howto.rst (79%) rename akka-docs/{ => rst}/scala/index.rst (100%) rename akka-docs/{ => rst}/scala/io.rst (100%) rename akka-docs/{ => rst}/scala/logging.rst (100%) rename akka-docs/{ => rst}/scala/microkernel.rst (90%) rename akka-docs/{ => rst}/scala/remoting.rst (90%) rename akka-docs/{ => rst}/scala/routing.rst (97%) rename akka-docs/{ => rst}/scala/scheduler.rst (89%) rename akka-docs/{ => rst}/scala/serialization.rst (100%) rename akka-docs/{ => rst}/scala/stm.rst (100%) rename akka-docs/{ => rst}/scala/testing.rst (99%) rename akka-docs/{ => rst}/scala/testkit-example.rst (100%) rename akka-docs/{ => rst}/scala/transactors.rst (100%) rename akka-docs/{ => rst}/scala/typed-actors.rst (100%) rename akka-docs/{ => rst}/scala/zeromq.rst (100%) diff --git a/.gitignore b/.gitignore index d44d7ea405..7fa5190d1f 100755 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,8 @@ multiverse.log .eprj .*.swp akka-docs/_build/ -akka-docs/epilog_rst +akka-docs/rst_html +akka-docs/rst_latex *.pyc akka-docs/exts/ _akka_cluster/ diff --git a/akka-docs/more.png b/akka-docs/more.png deleted file mode 100644 index 3eb7b05c84809454c095bcb61b27d83585540bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1502 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kuoif_IEF;D9-S7QBN8fc z{Qv!#H|O5ncIDoi)}U@yO|gadcDOt32;uP!OYU&HC?4rDuV$kA;y@ptD?gTWdM6!d zS)tNm>KNkWAfk1NskLcJl-JAFd*v_7^oy!0szW@vcpba1`g{AYCmOj`=Rb%i<|)a>`yt`uO3u&M7Y zj=cNJN+{#&k1dwpV;v?m-C9+Z`u4K^w8;Wz<>qhuv5!-LgGtNnY~C52wPMoK_XjQD z_`2fwa?^YAj7l6r3LGpwayC=qInJ*#FEU;Jn*F?9?(N+5^UwWnIKKQTLxw_Qc;}1A zG(FKZ=Wbm4A^7Vn_lBD-XW5FTCQVrS==rkuhlMwOT+g>>>H8h&jQ#%6zD&Q<#KN<; zUiE(_dR}9(%~}D=b2S`67v=Xdbo+XkC2r)LexkWcM&@62{f{(_f(fc-zxVF4%w_EN zFP?NDo%P)(UEc2avT$)-mn&RO&kcMen>803Sa8key^(V;joHw;uC zpL1nv&!3apDgGzUw&XaI-25;fE<42OngL5*uGxcY z@BFV!DN;${Re#7ZVYS#{6WyM^o(P6-%MUFV`S4@Q*3hF{Ur#@CcLB>;I|hcyTn&@$ zRjND143?CuJl80^=CGN&@X?o#9eKy@eb2wR-{X0TNXPx}cVExD^@Qv8;tdh)4P0!^ zGadw`IVifH5^dRcqq1jqvq1_AL%_1L%r7l1E*9A&&3ab0Km7jO&Z)Z0v$M6tM4mo- zrj+o-VFDN1g!R)79?bh=edE+#&rL zZp?jcx| z&x^MmH_Z(%e`Q(p*lgDMxjf#Q(tqRrMwnHEF)qCD*mb99$_b5}Z2=EfxTM$5u3hnT zH{-M$PrkqM?cAvUw&-)h8s^1S;%Pfy3(Cx$kbXPLNvCq|{nh6Ftmo%3y7eA@*r4Ye z&?+3L+!R0SyVRM8SKnXNu5?!QZh0Gcrs#TdMZ%eV7w$yv%_@L)n>VXH=s%k2*ZqD7a~ z%Kdm8eNQY|Z^!4?GD*rsrD4kU#6Jx})4jHBm($3c6TSJx+lZ1oIsf;*eeFE|xL-f- zAvT9h$rOf9W{Jzccg_^_KdDlXRsHz5Yv^g|SMmI_lh1YghV#q)G`J$jr)sQm>A^RX zTV+*jmsltLePr2HeAasERo2Z@XDwVUZ0`4#vxI+3WSWieO34#bI=@WyW-v3pJ=xB~ z=uVr9it&>Zih&ygO2y6x-tA)c+7SNguKL#*lB~xc&UCr7R3~lP`_. Don't use ``SNAPSHOT``. Note that the Scala version |scalaVersion| -is part of the artifactId. +If you are using the latest nightly build you should pick a timestamped Akka +version from +``_. +We recommend against using ``SNAPSHOT`` in order to obtain stable builds. A Simple Cluster Example ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -32,7 +34,7 @@ Try it out: 1. Add the following ``application.conf`` in your project, place it in ``src/main/resources``: -.. literalinclude:: ../../akka-samples/akka-sample-cluster/src/main/resources/application.conf +.. literalinclude:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf :language: none To enable cluster capabilities in your Akka project you should, at a minimum, add the :ref:`remoting-scala` @@ -47,20 +49,20 @@ ip-addresses or host names of the machines in ``application.conf`` instead of `` 2. Add the following main program to your project, place it in ``src/main/scala``: -.. literalinclude:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/simple/SimpleClusterApp.scala +.. literalinclude:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/simple/SimpleClusterApp.scala :language: scala 3. Start the first seed node. Open a sbt session in one terminal window and run:: - run-main sample.cluster.simple.SimpleClusterApp 2551 + run-main sample.cluster.simple.SimpleClusterApp 2551 2551 corresponds to the port of the first seed-nodes element in the configuration. In the log output you see that the cluster node has been started and changed status to 'Up'. 4. Start the second seed node. Open a sbt session in another terminal window and run:: - run-main sample.cluster.simple.SimpleClusterApp 2552 + run-main sample.cluster.simple.SimpleClusterApp 2552 2552 corresponds to the port of the second seed-nodes element in the configuration. @@ -71,7 +73,7 @@ Switch over to the first terminal window and see in the log output that the memb 5. Start another node. Open a sbt session in yet another terminal window and run:: - run-main sample.cluster.simple.SimpleClusterApp + run-main sample.cluster.simple.SimpleClusterApp Now you don't need to specify the port number, and it will use a random available port. It joins one of the configured seed nodes. Look at the log output in the different terminal @@ -167,15 +169,15 @@ added or removed to the cluster dynamically. In this example the following imports are used: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#imports +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#imports Messages: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#messages +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#messages The backend worker that performs the transformation job: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#backend +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#backend Note that the ``TransformationBackend`` actor subscribes to cluster events to detect new, potential, frontend nodes, and send them a registration message so that they know @@ -183,7 +185,7 @@ that they can use the backend worker. The frontend that receives user jobs and delegates to one of the registered backend workers: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#frontend +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala#frontend Note that the ``TransformationFrontend`` actor watch the registered backend to be able to remove it from its list of availble backend workers. @@ -224,7 +226,7 @@ routees are added to the router, according to the configuration. When using a router with routees looked up on the cluster member nodes, i.e. the routees are already running, the configuration for a router looks like this: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala#router-lookup-config +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala#router-lookup-config It's the relative actor path defined in ``routees-path`` that identify what actor to lookup. @@ -234,12 +236,12 @@ added to the router when nodes join the cluster. The same type of router could also have been defined in code: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#router-lookup-in-code +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#router-lookup-in-code When using a router with routees created and deployed on the cluster member nodes the configuration for a router looks like this: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala#router-deploy-config +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala#router-deploy-config ``nr-of-instances`` defines total number of routees in the cluster, but the number of routees @@ -249,7 +251,7 @@ the cluster. The same type of router could also have been defined in code: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#router-deploy-in-code +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#router-deploy-in-code See :ref:`cluster_configuration` section for further descriptions of the settings. @@ -267,19 +269,19 @@ the average number of characters per word when all results have been collected. In this example we use the following imports: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#imports +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#imports Messages: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#messages +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#messages The worker that counts number of characters in each word: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#worker +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#worker The service that receives text from users and splits it up into words, delegates to workers and aggregates: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#service +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#service Note, nothing cluster specific so far, just plain actors. @@ -290,7 +292,7 @@ or with create and deploy of routees. Remember, routees are the workers in this We start with the router setup with lookup of routees. All nodes start ``StatsService`` and ``StatsWorker`` actors and the router is configured with ``routees-path``: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#start-router-lookup +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#start-router-lookup This means that user requests can be sent to ``StatsService`` on any node and it will use ``StatsWorker`` on all nodes. There can only be one worker per node, but that worker could easily @@ -312,7 +314,7 @@ The above setup is nice for this example, but we will also take a look at how to a single master node that creates and deploys workers. To keep track of a single master we need one additional actor: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#facade +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#facade The ``StatsFacade`` receives text from users and delegates to the current ``StatsService``, the single master. It listens to cluster events to create or lookup the ``StatsService`` depending on if @@ -322,7 +324,7 @@ i.e. it can change when new nodes join or when current leader leaves. All nodes start ``StatsFacade`` and the router is now configured like this: -.. includecode:: ../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#start-router-deploy +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala#start-router-deploy This example is included in ``akka-samples/akka-sample-cluster`` @@ -407,7 +409,7 @@ There are several configuration properties for the cluster. We refer to the foll reference file for more information: -.. literalinclude:: ../../akka-cluster/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-cluster/src/main/resources/reference.conf :language: none Cluster Scheduler diff --git a/akka-docs/cluster/cluster.rst b/akka-docs/rst/cluster/cluster.rst similarity index 100% rename from akka-docs/cluster/cluster.rst rename to akka-docs/rst/cluster/cluster.rst diff --git a/akka-docs/cluster/images/member-states.png b/akka-docs/rst/cluster/images/member-states.png similarity index 100% rename from akka-docs/cluster/images/member-states.png rename to akka-docs/rst/cluster/images/member-states.png diff --git a/akka-docs/cluster/images/more.png b/akka-docs/rst/cluster/images/more.png similarity index 100% rename from akka-docs/cluster/images/more.png rename to akka-docs/rst/cluster/images/more.png diff --git a/akka-docs/cluster/index.rst b/akka-docs/rst/cluster/index.rst similarity index 100% rename from akka-docs/cluster/index.rst rename to akka-docs/rst/cluster/index.rst diff --git a/akka-docs/common/circuitbreaker.rst b/akka-docs/rst/common/circuitbreaker.rst similarity index 100% rename from akka-docs/common/circuitbreaker.rst rename to akka-docs/rst/common/circuitbreaker.rst diff --git a/akka-docs/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala b/akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala similarity index 100% rename from akka-docs/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala rename to akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala diff --git a/akka-docs/common/code/docs/circuitbreaker/DangerousJavaActor.java b/akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java similarity index 100% rename from akka-docs/common/code/docs/circuitbreaker/DangerousJavaActor.java rename to akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java diff --git a/akka-docs/common/code/docs/duration/Java.java b/akka-docs/rst/common/code/docs/duration/Java.java similarity index 100% rename from akka-docs/common/code/docs/duration/Java.java rename to akka-docs/rst/common/code/docs/duration/Java.java diff --git a/akka-docs/common/code/docs/duration/Sample.scala b/akka-docs/rst/common/code/docs/duration/Sample.scala similarity index 100% rename from akka-docs/common/code/docs/duration/Sample.scala rename to akka-docs/rst/common/code/docs/duration/Sample.scala diff --git a/akka-docs/common/duration.rst b/akka-docs/rst/common/duration.rst similarity index 100% rename from akka-docs/common/duration.rst rename to akka-docs/rst/common/duration.rst diff --git a/akka-docs/common/index.rst b/akka-docs/rst/common/index.rst similarity index 100% rename from akka-docs/common/index.rst rename to akka-docs/rst/common/index.rst diff --git a/akka-docs/conf.py b/akka-docs/rst/conf.py similarity index 83% rename from akka-docs/conf.py rename to akka-docs/rst/conf.py index 8f58ba0d87..ae3da13292 100644 --- a/akka-docs/conf.py +++ b/akka-docs/rst/conf.py @@ -7,7 +7,7 @@ import sys, os # -- General configuration ----------------------------------------------------- -sys.path.append(os.path.abspath('_sphinx/exts')) +sys.path.append(os.path.abspath('../_sphinx/exts')) extensions = ['sphinx.ext.todo', 'includecode'] templates_path = ['_templates'] @@ -17,29 +17,25 @@ exclude_patterns = ['_build', 'pending', 'disabled'] project = u'Akka' copyright = u'2011, Typesafe Inc' -version = '2.1-SNAPSHOT' -release = '2.1-SNAPSHOT' +version = '@version@' +release = '@version@' pygments_style = 'simple' highlight_language = 'scala' add_function_parentheses = False show_authors = True -f = open('epilog_rst', 'U') -rst_epilog = "\n" + f.read() -f.close() - # -- Options for HTML output --------------------------------------------------- html_theme = 'akka' -html_theme_path = ['_sphinx/themes'] -html_favicon = '_sphinx/static/favicon.ico' +html_theme_path = ['../_sphinx/themes'] +html_favicon = '../_sphinx/static/favicon.ico' html_title = 'Akka Documentation' -html_logo = '_sphinx/static/logo.png' +html_logo = '../_sphinx/static/logo.png' #html_favicon = None -html_static_path = ['_sphinx/static'] +html_static_path = ['../_sphinx/static'] html_last_updated_fmt = '%b %d, %Y' #html_sidebars = {} @@ -63,7 +59,7 @@ epub_language = "en" epub_publisher = epub_author epub_identifier = "http://doc.akka.io/docs/akka/snapshot/" epub_scheme = "URL" -epub_cover = ("_sphinx/static/akka.png", "") +epub_cover = ("../_sphinx/static/akka.png", "") # -- Options for LaTeX output -------------------------------------------------- diff --git a/akka-docs/dev/building-akka.rst b/akka-docs/rst/dev/building-akka.rst similarity index 100% rename from akka-docs/dev/building-akka.rst rename to akka-docs/rst/dev/building-akka.rst diff --git a/akka-docs/dev/developer-guidelines.rst b/akka-docs/rst/dev/developer-guidelines.rst similarity index 100% rename from akka-docs/dev/developer-guidelines.rst rename to akka-docs/rst/dev/developer-guidelines.rst diff --git a/akka-docs/dev/documentation.rst b/akka-docs/rst/dev/documentation.rst similarity index 100% rename from akka-docs/dev/documentation.rst rename to akka-docs/rst/dev/documentation.rst diff --git a/akka-docs/dev/index.rst b/akka-docs/rst/dev/index.rst similarity index 100% rename from akka-docs/dev/index.rst rename to akka-docs/rst/dev/index.rst diff --git a/akka-docs/dev/multi-jvm-testing.rst b/akka-docs/rst/dev/multi-jvm-testing.rst similarity index 98% rename from akka-docs/dev/multi-jvm-testing.rst rename to akka-docs/rst/dev/multi-jvm-testing.rst index 7658324a74..e08df5de9b 100644 --- a/akka-docs/dev/multi-jvm-testing.rst +++ b/akka-docs/rst/dev/multi-jvm-testing.rst @@ -49,8 +49,8 @@ multi-JVM testing (Simplified for clarity): lazy val buildSettings = Defaults.defaultSettings ++ SbtMultiJvm.multiJvmSettings ++ Seq( organization := "com.typesafe.akka", - version := "2.1-SNAPSHOT", - scalaVersion := "|scalaVersion|", + version := "@version@", + scalaVersion := "@scalaVersion@", crossPaths := false ) diff --git a/akka-docs/dev/team.rst b/akka-docs/rst/dev/team.rst similarity index 100% rename from akka-docs/dev/team.rst rename to akka-docs/rst/dev/team.rst diff --git a/akka-docs/experimental/index.rst b/akka-docs/rst/experimental/index.rst similarity index 100% rename from akka-docs/experimental/index.rst rename to akka-docs/rst/experimental/index.rst diff --git a/akka-docs/general/ActorPath.png b/akka-docs/rst/general/ActorPath.png similarity index 100% rename from akka-docs/general/ActorPath.png rename to akka-docs/rst/general/ActorPath.png diff --git a/akka-docs/general/RemoteDeployment.png b/akka-docs/rst/general/RemoteDeployment.png similarity index 100% rename from akka-docs/general/RemoteDeployment.png rename to akka-docs/rst/general/RemoteDeployment.png diff --git a/akka-docs/general/actor-systems.rst b/akka-docs/rst/general/actor-systems.rst similarity index 100% rename from akka-docs/general/actor-systems.rst rename to akka-docs/rst/general/actor-systems.rst diff --git a/akka-docs/general/actors.rst b/akka-docs/rst/general/actors.rst similarity index 100% rename from akka-docs/general/actors.rst rename to akka-docs/rst/general/actors.rst diff --git a/akka-docs/general/addressing.rst b/akka-docs/rst/general/addressing.rst similarity index 100% rename from akka-docs/general/addressing.rst rename to akka-docs/rst/general/addressing.rst diff --git a/akka-docs/general/code/docs/config/ConfigDoc.java b/akka-docs/rst/general/code/docs/config/ConfigDoc.java similarity index 100% rename from akka-docs/general/code/docs/config/ConfigDoc.java rename to akka-docs/rst/general/code/docs/config/ConfigDoc.java diff --git a/akka-docs/general/code/docs/config/ConfigDocSpec.scala b/akka-docs/rst/general/code/docs/config/ConfigDocSpec.scala similarity index 100% rename from akka-docs/general/code/docs/config/ConfigDocSpec.scala rename to akka-docs/rst/general/code/docs/config/ConfigDocSpec.scala diff --git a/akka-docs/general/configuration.rst b/akka-docs/rst/general/configuration.rst similarity index 95% rename from akka-docs/general/configuration.rst rename to akka-docs/rst/general/configuration.rst index 78c2fee4b8..47d471863c 100644 --- a/akka-docs/general/configuration.rst +++ b/akka-docs/rst/general/configuration.rst @@ -142,7 +142,7 @@ before or after using them to construct an actor system: .. parsed-literal:: - Welcome to Scala version |scalaVersion| (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_27). + Welcome to Scala version @scalaVersion@ (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_27). Type in expressions to have them evaluated. Type :help for more information. @@ -337,41 +337,41 @@ Each Akka module has a reference configuration file with the default values. akka-actor ~~~~~~~~~~ -.. literalinclude:: ../../akka-actor/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-actor/src/main/resources/reference.conf :language: none akka-remote ~~~~~~~~~~~ -.. literalinclude:: ../../akka-remote/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-remote/src/main/resources/reference.conf :language: none akka-testkit ~~~~~~~~~~~~ -.. literalinclude:: ../../akka-testkit/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-testkit/src/main/resources/reference.conf :language: none akka-transactor ~~~~~~~~~~~~~~~ -.. literalinclude:: ../../akka-transactor/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-transactor/src/main/resources/reference.conf :language: none akka-agent ~~~~~~~~~~ -.. literalinclude:: ../../akka-agent/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-agent/src/main/resources/reference.conf :language: none akka-zeromq ~~~~~~~~~~~ -.. literalinclude:: ../../akka-zeromq/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-zeromq/src/main/resources/reference.conf :language: none akka-file-mailbox ~~~~~~~~~~~~~~~~~ -.. literalinclude:: ../../akka-durable-mailboxes/akka-file-mailbox/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-durable-mailboxes/akka-file-mailbox/src/main/resources/reference.conf :language: none diff --git a/akka-docs/general/guardians.png b/akka-docs/rst/general/guardians.png similarity index 100% rename from akka-docs/general/guardians.png rename to akka-docs/rst/general/guardians.png diff --git a/akka-docs/general/index.rst b/akka-docs/rst/general/index.rst similarity index 100% rename from akka-docs/general/index.rst rename to akka-docs/rst/general/index.rst diff --git a/akka-docs/general/jmm.rst b/akka-docs/rst/general/jmm.rst similarity index 100% rename from akka-docs/general/jmm.rst rename to akka-docs/rst/general/jmm.rst diff --git a/akka-docs/general/message-send-semantics.rst b/akka-docs/rst/general/message-send-semantics.rst similarity index 100% rename from akka-docs/general/message-send-semantics.rst rename to akka-docs/rst/general/message-send-semantics.rst diff --git a/akka-docs/general/remoting.rst b/akka-docs/rst/general/remoting.rst similarity index 100% rename from akka-docs/general/remoting.rst rename to akka-docs/rst/general/remoting.rst diff --git a/akka-docs/general/supervision.rst b/akka-docs/rst/general/supervision.rst similarity index 100% rename from akka-docs/general/supervision.rst rename to akka-docs/rst/general/supervision.rst diff --git a/akka-docs/images/akka-remote-testconductor.png b/akka-docs/rst/images/akka-remote-testconductor.png similarity index 100% rename from akka-docs/images/akka-remote-testconductor.png rename to akka-docs/rst/images/akka-remote-testconductor.png diff --git a/akka-docs/images/benchmark-akka-sample-trading-throughput.png b/akka-docs/rst/images/benchmark-akka-sample-trading-throughput.png similarity index 100% rename from akka-docs/images/benchmark-akka-sample-trading-throughput.png rename to akka-docs/rst/images/benchmark-akka-sample-trading-throughput.png diff --git a/akka-docs/images/build-path.png b/akka-docs/rst/images/build-path.png similarity index 100% rename from akka-docs/images/build-path.png rename to akka-docs/rst/images/build-path.png diff --git a/akka-docs/images/circuit-breaker-states.dot b/akka-docs/rst/images/circuit-breaker-states.dot similarity index 100% rename from akka-docs/images/circuit-breaker-states.dot rename to akka-docs/rst/images/circuit-breaker-states.dot diff --git a/akka-docs/images/circuit-breaker-states.png b/akka-docs/rst/images/circuit-breaker-states.png similarity index 100% rename from akka-docs/images/circuit-breaker-states.png rename to akka-docs/rst/images/circuit-breaker-states.png diff --git a/akka-docs/images/clojure-trees.png b/akka-docs/rst/images/clojure-trees.png similarity index 100% rename from akka-docs/images/clojure-trees.png rename to akka-docs/rst/images/clojure-trees.png diff --git a/akka-docs/images/diagnostics-window.png b/akka-docs/rst/images/diagnostics-window.png similarity index 100% rename from akka-docs/images/diagnostics-window.png rename to akka-docs/rst/images/diagnostics-window.png diff --git a/akka-docs/images/example-code.png b/akka-docs/rst/images/example-code.png similarity index 100% rename from akka-docs/images/example-code.png rename to akka-docs/rst/images/example-code.png diff --git a/akka-docs/images/faulttolerancesample-failure-flow.png b/akka-docs/rst/images/faulttolerancesample-failure-flow.png similarity index 100% rename from akka-docs/images/faulttolerancesample-failure-flow.png rename to akka-docs/rst/images/faulttolerancesample-failure-flow.png diff --git a/akka-docs/images/faulttolerancesample-normal-flow.png b/akka-docs/rst/images/faulttolerancesample-normal-flow.png similarity index 100% rename from akka-docs/images/faulttolerancesample-normal-flow.png rename to akka-docs/rst/images/faulttolerancesample-normal-flow.png diff --git a/akka-docs/images/faulttolerancesample.graffle b/akka-docs/rst/images/faulttolerancesample.graffle similarity index 100% rename from akka-docs/images/faulttolerancesample.graffle rename to akka-docs/rst/images/faulttolerancesample.graffle diff --git a/akka-docs/images/import-project.png b/akka-docs/rst/images/import-project.png similarity index 100% rename from akka-docs/images/import-project.png rename to akka-docs/rst/images/import-project.png diff --git a/akka-docs/images/install-beta2-updatesite.png b/akka-docs/rst/images/install-beta2-updatesite.png similarity index 100% rename from akka-docs/images/install-beta2-updatesite.png rename to akka-docs/rst/images/install-beta2-updatesite.png diff --git a/akka-docs/images/pi-formula.png b/akka-docs/rst/images/pi-formula.png similarity index 100% rename from akka-docs/images/pi-formula.png rename to akka-docs/rst/images/pi-formula.png diff --git a/akka-docs/images/quickfix.png b/akka-docs/rst/images/quickfix.png similarity index 100% rename from akka-docs/images/quickfix.png rename to akka-docs/rst/images/quickfix.png diff --git a/akka-docs/images/run-config.png b/akka-docs/rst/images/run-config.png similarity index 100% rename from akka-docs/images/run-config.png rename to akka-docs/rst/images/run-config.png diff --git a/akka-docs/index.rst b/akka-docs/rst/index.rst similarity index 100% rename from akka-docs/index.rst rename to akka-docs/rst/index.rst diff --git a/akka-docs/intro/deployment-scenarios.rst b/akka-docs/rst/intro/deployment-scenarios.rst similarity index 100% rename from akka-docs/intro/deployment-scenarios.rst rename to akka-docs/rst/intro/deployment-scenarios.rst diff --git a/akka-docs/intro/getting-started.rst b/akka-docs/rst/intro/getting-started.rst similarity index 76% rename from akka-docs/intro/getting-started.rst rename to akka-docs/rst/intro/getting-started.rst index 11b699fa8f..fdd6169abd 100644 --- a/akka-docs/intro/getting-started.rst +++ b/akka-docs/rst/intro/getting-started.rst @@ -29,18 +29,21 @@ Akka Maven repository. Modules ------- -Akka is very modular and has many JARs for containing different features. +Akka is very modular and consists of several JARs containing different features. -- ``akka-actor-2.1-SNAPSHOT.jar`` -- Classic Actors, Typed Actors, IO Actor etc. -- ``akka-remote-2.1-SNAPSHOT.jar`` -- Remote Actors -- ``akka-testkit-2.1-SNAPSHOT.jar`` -- Toolkit for testing Actor systems -- ``akka-kernel-2.1-SNAPSHOT.jar`` -- Akka microkernel for running a bare-bones mini application server -- ``akka-transactor-2.1-SNAPSHOT.jar`` -- Transactors - transactional actors, integrated with Scala STM -- ``akka-agent-2.1-SNAPSHOT.jar`` -- Agents, integrated with Scala STM -- ``akka-camel-2.1-SNAPSHOT.jar`` -- Apache Camel integration -- ``akka-zeromq-2.1-SNAPSHOT.jar`` -- ZeroMQ integration -- ``akka-slf4j-2.1-SNAPSHOT.jar`` -- SLF4J Event Handler Listener -- ``akka--mailbox-2.1-SNAPSHOT.jar`` -- Akka durable mailboxes +- ``akka-actor`` -- Classic Actors, Typed Actors, IO Actor etc. +- ``akka-remote`` -- Remote Actors +- ``akka-testkit`` -- Toolkit for testing Actor systems +- ``akka-kernel`` -- Akka microkernel for running a bare-bones mini application server +- ``akka-transactor`` -- Transactors - transactional actors, integrated with Scala STM +- ``akka-agent`` -- Agents, integrated with Scala STM +- ``akka-camel`` -- Apache Camel integration +- ``akka-zeromq`` -- ZeroMQ integration +- ``akka-slf4j`` -- SLF4J Event Handler Listener +- ``akka-filebased-mailbox`` -- Akka durable mailbox (find more among community projects) + +The filename of the actual JAR is for example ``@jarName@`` (and analog for +the other modules). How to see the JARs dependencies of each Akka module is described in the :ref:`dependencies` section. @@ -84,26 +87,16 @@ The simplest way to get started with Akka and Maven is to check out the `Akka/Maven template `_ project. -Summary of the essential parts for using Akka with Maven: - -1) Add this repository to your ``pom.xml``: - -.. code-block:: xml - - - typesafe - Typesafe Repository - http://repo.typesafe.com/typesafe/releases/ - - -2) Add the Akka dependencies. For example, here is the dependency for Akka Actor 2.1-SNAPSHOT: +Since Akka is published to Maven Central (for versions since 2.1-M2), is it +enough to add the Akka dependencies to the POM. For example, here is the +dependency for akka-actor: .. code-block:: xml com.typesafe.akka - akka-actor - 2.1-SNAPSHOT + akka-actor_@binVersion@ + @version@ **Note**: for snapshot versions both ``SNAPSHOT`` and timestamped versions are published. @@ -128,11 +121,12 @@ SBT installation instructions on `https://github.com/harrah/xsbt/wiki/Setup `_. Thanks for being a part of the Akka community. + diff --git a/akka-docs/intro/index.rst b/akka-docs/rst/intro/index.rst similarity index 100% rename from akka-docs/intro/index.rst rename to akka-docs/rst/intro/index.rst diff --git a/akka-docs/intro/use-cases.rst b/akka-docs/rst/intro/use-cases.rst similarity index 100% rename from akka-docs/intro/use-cases.rst rename to akka-docs/rst/intro/use-cases.rst diff --git a/akka-docs/intro/what-is-akka.rst b/akka-docs/rst/intro/what-is-akka.rst similarity index 100% rename from akka-docs/intro/what-is-akka.rst rename to akka-docs/rst/intro/what-is-akka.rst diff --git a/akka-docs/intro/why-akka.rst b/akka-docs/rst/intro/why-akka.rst similarity index 100% rename from akka-docs/intro/why-akka.rst rename to akka-docs/rst/intro/why-akka.rst diff --git a/akka-docs/java/agents.rst b/akka-docs/rst/java/agents.rst similarity index 100% rename from akka-docs/java/agents.rst rename to akka-docs/rst/java/agents.rst diff --git a/akka-docs/java/camel.rst b/akka-docs/rst/java/camel.rst similarity index 100% rename from akka-docs/java/camel.rst rename to akka-docs/rst/java/camel.rst diff --git a/akka-docs/java/code/docs/actor/FSMDocTest.scala b/akka-docs/rst/java/code/docs/actor/FSMDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/actor/FSMDocTest.scala rename to akka-docs/rst/java/code/docs/actor/FSMDocTest.scala diff --git a/akka-docs/java/code/docs/actor/FSMDocTestBase.java b/akka-docs/rst/java/code/docs/actor/FSMDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/actor/FSMDocTestBase.java rename to akka-docs/rst/java/code/docs/actor/FSMDocTestBase.java diff --git a/akka-docs/java/code/docs/actor/FaultHandlingTest.scala b/akka-docs/rst/java/code/docs/actor/FaultHandlingTest.scala similarity index 100% rename from akka-docs/java/code/docs/actor/FaultHandlingTest.scala rename to akka-docs/rst/java/code/docs/actor/FaultHandlingTest.scala diff --git a/akka-docs/java/code/docs/actor/FaultHandlingTestBase.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java similarity index 100% rename from akka-docs/java/code/docs/actor/FaultHandlingTestBase.java rename to akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java diff --git a/akka-docs/java/code/docs/actor/FirstUntypedActor.java b/akka-docs/rst/java/code/docs/actor/FirstUntypedActor.java similarity index 100% rename from akka-docs/java/code/docs/actor/FirstUntypedActor.java rename to akka-docs/rst/java/code/docs/actor/FirstUntypedActor.java diff --git a/akka-docs/java/code/docs/actor/ImmutableMessage.java b/akka-docs/rst/java/code/docs/actor/ImmutableMessage.java similarity index 100% rename from akka-docs/java/code/docs/actor/ImmutableMessage.java rename to akka-docs/rst/java/code/docs/actor/ImmutableMessage.java diff --git a/akka-docs/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java b/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java similarity index 100% rename from akka-docs/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java rename to akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java diff --git a/akka-docs/java/code/docs/actor/MyUntypedActor.java b/akka-docs/rst/java/code/docs/actor/MyUntypedActor.java similarity index 100% rename from akka-docs/java/code/docs/actor/MyUntypedActor.java rename to akka-docs/rst/java/code/docs/actor/MyUntypedActor.java diff --git a/akka-docs/java/code/docs/actor/SchedulerDocTest.scala b/akka-docs/rst/java/code/docs/actor/SchedulerDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/actor/SchedulerDocTest.scala rename to akka-docs/rst/java/code/docs/actor/SchedulerDocTest.scala diff --git a/akka-docs/java/code/docs/actor/SchedulerDocTestBase.java b/akka-docs/rst/java/code/docs/actor/SchedulerDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/actor/SchedulerDocTestBase.java rename to akka-docs/rst/java/code/docs/actor/SchedulerDocTestBase.java diff --git a/akka-docs/java/code/docs/actor/TypedActorDocTest.scala b/akka-docs/rst/java/code/docs/actor/TypedActorDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/actor/TypedActorDocTest.scala rename to akka-docs/rst/java/code/docs/actor/TypedActorDocTest.scala diff --git a/akka-docs/java/code/docs/actor/TypedActorDocTestBase.java b/akka-docs/rst/java/code/docs/actor/TypedActorDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/actor/TypedActorDocTestBase.java rename to akka-docs/rst/java/code/docs/actor/TypedActorDocTestBase.java diff --git a/akka-docs/java/code/docs/actor/UntypedActorDocTest.scala b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/actor/UntypedActorDocTest.scala rename to akka-docs/rst/java/code/docs/actor/UntypedActorDocTest.scala diff --git a/akka-docs/java/code/docs/actor/UntypedActorDocTestBase.java b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/actor/UntypedActorDocTestBase.java rename to akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java diff --git a/akka-docs/java/code/docs/actor/UntypedActorSwapper.java b/akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java similarity index 100% rename from akka-docs/java/code/docs/actor/UntypedActorSwapper.java rename to akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java diff --git a/akka-docs/java/code/docs/actor/japi/FaultHandlingDocSample.java b/akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java similarity index 100% rename from akka-docs/java/code/docs/actor/japi/FaultHandlingDocSample.java rename to akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java diff --git a/akka-docs/java/code/docs/agent/AgentDocJavaSpec.scala b/akka-docs/rst/java/code/docs/agent/AgentDocJavaSpec.scala similarity index 100% rename from akka-docs/java/code/docs/agent/AgentDocJavaSpec.scala rename to akka-docs/rst/java/code/docs/agent/AgentDocJavaSpec.scala diff --git a/akka-docs/java/code/docs/agent/AgentDocTest.java b/akka-docs/rst/java/code/docs/agent/AgentDocTest.java similarity index 100% rename from akka-docs/java/code/docs/agent/AgentDocTest.java rename to akka-docs/rst/java/code/docs/agent/AgentDocTest.java diff --git a/akka-docs/java/code/docs/camel/ActivationTestBase.java b/akka-docs/rst/java/code/docs/camel/ActivationTestBase.java similarity index 100% rename from akka-docs/java/code/docs/camel/ActivationTestBase.java rename to akka-docs/rst/java/code/docs/camel/ActivationTestBase.java diff --git a/akka-docs/java/code/docs/camel/CamelExtensionDocTest.scala b/akka-docs/rst/java/code/docs/camel/CamelExtensionDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/camel/CamelExtensionDocTest.scala rename to akka-docs/rst/java/code/docs/camel/CamelExtensionDocTest.scala diff --git a/akka-docs/java/code/docs/camel/CamelExtensionTestBase.java b/akka-docs/rst/java/code/docs/camel/CamelExtensionTestBase.java similarity index 100% rename from akka-docs/java/code/docs/camel/CamelExtensionTestBase.java rename to akka-docs/rst/java/code/docs/camel/CamelExtensionTestBase.java diff --git a/akka-docs/java/code/docs/camel/Consumer1.java b/akka-docs/rst/java/code/docs/camel/Consumer1.java similarity index 100% rename from akka-docs/java/code/docs/camel/Consumer1.java rename to akka-docs/rst/java/code/docs/camel/Consumer1.java diff --git a/akka-docs/java/code/docs/camel/Consumer2.java b/akka-docs/rst/java/code/docs/camel/Consumer2.java similarity index 100% rename from akka-docs/java/code/docs/camel/Consumer2.java rename to akka-docs/rst/java/code/docs/camel/Consumer2.java diff --git a/akka-docs/java/code/docs/camel/Consumer3.java b/akka-docs/rst/java/code/docs/camel/Consumer3.java similarity index 100% rename from akka-docs/java/code/docs/camel/Consumer3.java rename to akka-docs/rst/java/code/docs/camel/Consumer3.java diff --git a/akka-docs/java/code/docs/camel/Consumer4.java b/akka-docs/rst/java/code/docs/camel/Consumer4.java similarity index 100% rename from akka-docs/java/code/docs/camel/Consumer4.java rename to akka-docs/rst/java/code/docs/camel/Consumer4.java diff --git a/akka-docs/java/code/docs/camel/CustomRouteBuilder.java b/akka-docs/rst/java/code/docs/camel/CustomRouteBuilder.java similarity index 100% rename from akka-docs/java/code/docs/camel/CustomRouteBuilder.java rename to akka-docs/rst/java/code/docs/camel/CustomRouteBuilder.java diff --git a/akka-docs/java/code/docs/camel/CustomRouteTestBase.java b/akka-docs/rst/java/code/docs/camel/CustomRouteTestBase.java similarity index 100% rename from akka-docs/java/code/docs/camel/CustomRouteTestBase.java rename to akka-docs/rst/java/code/docs/camel/CustomRouteTestBase.java diff --git a/akka-docs/java/code/docs/camel/ErrorThrowingConsumer.java b/akka-docs/rst/java/code/docs/camel/ErrorThrowingConsumer.java similarity index 100% rename from akka-docs/java/code/docs/camel/ErrorThrowingConsumer.java rename to akka-docs/rst/java/code/docs/camel/ErrorThrowingConsumer.java diff --git a/akka-docs/java/code/docs/camel/FirstProducer.java b/akka-docs/rst/java/code/docs/camel/FirstProducer.java similarity index 100% rename from akka-docs/java/code/docs/camel/FirstProducer.java rename to akka-docs/rst/java/code/docs/camel/FirstProducer.java diff --git a/akka-docs/java/code/docs/camel/Forwarder.java b/akka-docs/rst/java/code/docs/camel/Forwarder.java similarity index 100% rename from akka-docs/java/code/docs/camel/Forwarder.java rename to akka-docs/rst/java/code/docs/camel/Forwarder.java diff --git a/akka-docs/java/code/docs/camel/MyActor.java b/akka-docs/rst/java/code/docs/camel/MyActor.java similarity index 100% rename from akka-docs/java/code/docs/camel/MyActor.java rename to akka-docs/rst/java/code/docs/camel/MyActor.java diff --git a/akka-docs/java/code/docs/camel/MyEndpoint.java b/akka-docs/rst/java/code/docs/camel/MyEndpoint.java similarity index 100% rename from akka-docs/java/code/docs/camel/MyEndpoint.java rename to akka-docs/rst/java/code/docs/camel/MyEndpoint.java diff --git a/akka-docs/java/code/docs/camel/OnRouteResponseTestBase.java b/akka-docs/rst/java/code/docs/camel/OnRouteResponseTestBase.java similarity index 100% rename from akka-docs/java/code/docs/camel/OnRouteResponseTestBase.java rename to akka-docs/rst/java/code/docs/camel/OnRouteResponseTestBase.java diff --git a/akka-docs/java/code/docs/camel/OnewaySender.java b/akka-docs/rst/java/code/docs/camel/OnewaySender.java similarity index 100% rename from akka-docs/java/code/docs/camel/OnewaySender.java rename to akka-docs/rst/java/code/docs/camel/OnewaySender.java diff --git a/akka-docs/java/code/docs/camel/Orders.java b/akka-docs/rst/java/code/docs/camel/Orders.java similarity index 100% rename from akka-docs/java/code/docs/camel/Orders.java rename to akka-docs/rst/java/code/docs/camel/Orders.java diff --git a/akka-docs/java/code/docs/camel/Producer1.java b/akka-docs/rst/java/code/docs/camel/Producer1.java similarity index 100% rename from akka-docs/java/code/docs/camel/Producer1.java rename to akka-docs/rst/java/code/docs/camel/Producer1.java diff --git a/akka-docs/java/code/docs/camel/ProducerTestBase.java b/akka-docs/rst/java/code/docs/camel/ProducerTestBase.java similarity index 100% rename from akka-docs/java/code/docs/camel/ProducerTestBase.java rename to akka-docs/rst/java/code/docs/camel/ProducerTestBase.java diff --git a/akka-docs/java/code/docs/camel/RequestBodyActor.java b/akka-docs/rst/java/code/docs/camel/RequestBodyActor.java similarity index 100% rename from akka-docs/java/code/docs/camel/RequestBodyActor.java rename to akka-docs/rst/java/code/docs/camel/RequestBodyActor.java diff --git a/akka-docs/java/code/docs/camel/Responder.java b/akka-docs/rst/java/code/docs/camel/Responder.java similarity index 100% rename from akka-docs/java/code/docs/camel/Responder.java rename to akka-docs/rst/java/code/docs/camel/Responder.java diff --git a/akka-docs/java/code/docs/camel/ResponseReceiver.java b/akka-docs/rst/java/code/docs/camel/ResponseReceiver.java similarity index 100% rename from akka-docs/java/code/docs/camel/ResponseReceiver.java rename to akka-docs/rst/java/code/docs/camel/ResponseReceiver.java diff --git a/akka-docs/java/code/docs/camel/Transformer.java b/akka-docs/rst/java/code/docs/camel/Transformer.java similarity index 100% rename from akka-docs/java/code/docs/camel/Transformer.java rename to akka-docs/rst/java/code/docs/camel/Transformer.java diff --git a/akka-docs/java/code/docs/camel/sample/http/HttpConsumer.java b/akka-docs/rst/java/code/docs/camel/sample/http/HttpConsumer.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/http/HttpConsumer.java rename to akka-docs/rst/java/code/docs/camel/sample/http/HttpConsumer.java diff --git a/akka-docs/java/code/docs/camel/sample/http/HttpProducer.java b/akka-docs/rst/java/code/docs/camel/sample/http/HttpProducer.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/http/HttpProducer.java rename to akka-docs/rst/java/code/docs/camel/sample/http/HttpProducer.java diff --git a/akka-docs/java/code/docs/camel/sample/http/HttpSample.java b/akka-docs/rst/java/code/docs/camel/sample/http/HttpSample.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/http/HttpSample.java rename to akka-docs/rst/java/code/docs/camel/sample/http/HttpSample.java diff --git a/akka-docs/java/code/docs/camel/sample/http/HttpTransformer.java b/akka-docs/rst/java/code/docs/camel/sample/http/HttpTransformer.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/http/HttpTransformer.java rename to akka-docs/rst/java/code/docs/camel/sample/http/HttpTransformer.java diff --git a/akka-docs/java/code/docs/camel/sample/quartz/MyQuartzActor.java b/akka-docs/rst/java/code/docs/camel/sample/quartz/MyQuartzActor.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/quartz/MyQuartzActor.java rename to akka-docs/rst/java/code/docs/camel/sample/quartz/MyQuartzActor.java diff --git a/akka-docs/java/code/docs/camel/sample/quartz/QuartzSample.java b/akka-docs/rst/java/code/docs/camel/sample/quartz/QuartzSample.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/quartz/QuartzSample.java rename to akka-docs/rst/java/code/docs/camel/sample/quartz/QuartzSample.java diff --git a/akka-docs/java/code/docs/camel/sample/route/Consumer3.java b/akka-docs/rst/java/code/docs/camel/sample/route/Consumer3.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/route/Consumer3.java rename to akka-docs/rst/java/code/docs/camel/sample/route/Consumer3.java diff --git a/akka-docs/java/code/docs/camel/sample/route/CustomRouteBuilder.java b/akka-docs/rst/java/code/docs/camel/sample/route/CustomRouteBuilder.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/route/CustomRouteBuilder.java rename to akka-docs/rst/java/code/docs/camel/sample/route/CustomRouteBuilder.java diff --git a/akka-docs/java/code/docs/camel/sample/route/CustomRouteSample.java b/akka-docs/rst/java/code/docs/camel/sample/route/CustomRouteSample.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/route/CustomRouteSample.java rename to akka-docs/rst/java/code/docs/camel/sample/route/CustomRouteSample.java diff --git a/akka-docs/java/code/docs/camel/sample/route/Producer1.java b/akka-docs/rst/java/code/docs/camel/sample/route/Producer1.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/route/Producer1.java rename to akka-docs/rst/java/code/docs/camel/sample/route/Producer1.java diff --git a/akka-docs/java/code/docs/camel/sample/route/Transformer.java b/akka-docs/rst/java/code/docs/camel/sample/route/Transformer.java similarity index 100% rename from akka-docs/java/code/docs/camel/sample/route/Transformer.java rename to akka-docs/rst/java/code/docs/camel/sample/route/Transformer.java diff --git a/akka-docs/java/code/docs/dispatcher/DispatcherDocTest.scala b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/dispatcher/DispatcherDocTest.scala rename to akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTest.scala diff --git a/akka-docs/java/code/docs/dispatcher/DispatcherDocTestBase.java b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/dispatcher/DispatcherDocTestBase.java rename to akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java diff --git a/akka-docs/java/code/docs/event/LoggingDocTest.scala b/akka-docs/rst/java/code/docs/event/LoggingDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/event/LoggingDocTest.scala rename to akka-docs/rst/java/code/docs/event/LoggingDocTest.scala diff --git a/akka-docs/java/code/docs/event/LoggingDocTestBase.java b/akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/event/LoggingDocTestBase.java rename to akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java diff --git a/akka-docs/java/code/docs/extension/ExtensionDocTest.scala b/akka-docs/rst/java/code/docs/extension/ExtensionDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/extension/ExtensionDocTest.scala rename to akka-docs/rst/java/code/docs/extension/ExtensionDocTest.scala diff --git a/akka-docs/java/code/docs/extension/ExtensionDocTestBase.java b/akka-docs/rst/java/code/docs/extension/ExtensionDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/extension/ExtensionDocTestBase.java rename to akka-docs/rst/java/code/docs/extension/ExtensionDocTestBase.java diff --git a/akka-docs/java/code/docs/extension/SettingsExtensionDocTest.scala b/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/extension/SettingsExtensionDocTest.scala rename to akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTest.scala diff --git a/akka-docs/java/code/docs/extension/SettingsExtensionDocTestBase.java b/akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/extension/SettingsExtensionDocTestBase.java rename to akka-docs/rst/java/code/docs/extension/SettingsExtensionDocTestBase.java diff --git a/akka-docs/java/code/docs/future/FutureDocTest.scala b/akka-docs/rst/java/code/docs/future/FutureDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/future/FutureDocTest.scala rename to akka-docs/rst/java/code/docs/future/FutureDocTest.scala diff --git a/akka-docs/java/code/docs/future/FutureDocTestBase.java b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/future/FutureDocTestBase.java rename to akka-docs/rst/java/code/docs/future/FutureDocTestBase.java diff --git a/akka-docs/java/code/docs/jrouting/ConsistentHashingRouterDocTest.scala b/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/jrouting/ConsistentHashingRouterDocTest.scala rename to akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTest.scala diff --git a/akka-docs/java/code/docs/jrouting/ConsistentHashingRouterDocTestBase.java b/akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/ConsistentHashingRouterDocTestBase.java rename to akka-docs/rst/java/code/docs/jrouting/ConsistentHashingRouterDocTestBase.java diff --git a/akka-docs/java/code/docs/jrouting/CustomRouterDocTest.scala b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/jrouting/CustomRouterDocTest.scala rename to akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTest.scala diff --git a/akka-docs/java/code/docs/jrouting/CustomRouterDocTestBase.java b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/CustomRouterDocTestBase.java rename to akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java diff --git a/akka-docs/java/code/docs/jrouting/FibonacciActor.java b/akka-docs/rst/java/code/docs/jrouting/FibonacciActor.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/FibonacciActor.java rename to akka-docs/rst/java/code/docs/jrouting/FibonacciActor.java diff --git a/akka-docs/java/code/docs/jrouting/ParentActor.java b/akka-docs/rst/java/code/docs/jrouting/ParentActor.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/ParentActor.java rename to akka-docs/rst/java/code/docs/jrouting/ParentActor.java diff --git a/akka-docs/java/code/docs/jrouting/PrintlnActor.java b/akka-docs/rst/java/code/docs/jrouting/PrintlnActor.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/PrintlnActor.java rename to akka-docs/rst/java/code/docs/jrouting/PrintlnActor.java diff --git a/akka-docs/java/code/docs/jrouting/RouterViaConfigExample.java b/akka-docs/rst/java/code/docs/jrouting/RouterViaConfigExample.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/RouterViaConfigExample.java rename to akka-docs/rst/java/code/docs/jrouting/RouterViaConfigExample.java diff --git a/akka-docs/java/code/docs/jrouting/RouterViaProgramExample.java b/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java similarity index 100% rename from akka-docs/java/code/docs/jrouting/RouterViaProgramExample.java rename to akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java diff --git a/akka-docs/java/code/docs/pattern/JavaTemplate.java b/akka-docs/rst/java/code/docs/pattern/JavaTemplate.java similarity index 100% rename from akka-docs/java/code/docs/pattern/JavaTemplate.java rename to akka-docs/rst/java/code/docs/pattern/JavaTemplate.java diff --git a/akka-docs/java/code/docs/remoting/RemoteActorExample.java b/akka-docs/rst/java/code/docs/remoting/RemoteActorExample.java similarity index 100% rename from akka-docs/java/code/docs/remoting/RemoteActorExample.java rename to akka-docs/rst/java/code/docs/remoting/RemoteActorExample.java diff --git a/akka-docs/java/code/docs/remoting/RemoteDeploymentDocTest.scala b/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/remoting/RemoteDeploymentDocTest.scala rename to akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTest.scala diff --git a/akka-docs/java/code/docs/remoting/RemoteDeploymentDocTestBase.java b/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/remoting/RemoteDeploymentDocTestBase.java rename to akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java diff --git a/akka-docs/java/code/docs/serialization/SerializationDocTest.scala b/akka-docs/rst/java/code/docs/serialization/SerializationDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/serialization/SerializationDocTest.scala rename to akka-docs/rst/java/code/docs/serialization/SerializationDocTest.scala diff --git a/akka-docs/java/code/docs/serialization/SerializationDocTestBase.java b/akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/serialization/SerializationDocTestBase.java rename to akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java diff --git a/akka-docs/java/code/docs/testkit/TestKitDocTest.java b/akka-docs/rst/java/code/docs/testkit/TestKitDocTest.java similarity index 100% rename from akka-docs/java/code/docs/testkit/TestKitDocTest.java rename to akka-docs/rst/java/code/docs/testkit/TestKitDocTest.java diff --git a/akka-docs/java/code/docs/testkit/TestKitSampleTest.java b/akka-docs/rst/java/code/docs/testkit/TestKitSampleTest.java similarity index 100% rename from akka-docs/java/code/docs/testkit/TestKitSampleTest.java rename to akka-docs/rst/java/code/docs/testkit/TestKitSampleTest.java diff --git a/akka-docs/java/code/docs/transactor/CoordinatedCounter.java b/akka-docs/rst/java/code/docs/transactor/CoordinatedCounter.java similarity index 100% rename from akka-docs/java/code/docs/transactor/CoordinatedCounter.java rename to akka-docs/rst/java/code/docs/transactor/CoordinatedCounter.java diff --git a/akka-docs/java/code/docs/transactor/Coordinator.java b/akka-docs/rst/java/code/docs/transactor/Coordinator.java similarity index 100% rename from akka-docs/java/code/docs/transactor/Coordinator.java rename to akka-docs/rst/java/code/docs/transactor/Coordinator.java diff --git a/akka-docs/java/code/docs/transactor/Counter.java b/akka-docs/rst/java/code/docs/transactor/Counter.java similarity index 100% rename from akka-docs/java/code/docs/transactor/Counter.java rename to akka-docs/rst/java/code/docs/transactor/Counter.java diff --git a/akka-docs/java/code/docs/transactor/FriendlyCounter.java b/akka-docs/rst/java/code/docs/transactor/FriendlyCounter.java similarity index 100% rename from akka-docs/java/code/docs/transactor/FriendlyCounter.java rename to akka-docs/rst/java/code/docs/transactor/FriendlyCounter.java diff --git a/akka-docs/java/code/docs/transactor/Increment.java b/akka-docs/rst/java/code/docs/transactor/Increment.java similarity index 100% rename from akka-docs/java/code/docs/transactor/Increment.java rename to akka-docs/rst/java/code/docs/transactor/Increment.java diff --git a/akka-docs/java/code/docs/transactor/Message.java b/akka-docs/rst/java/code/docs/transactor/Message.java similarity index 100% rename from akka-docs/java/code/docs/transactor/Message.java rename to akka-docs/rst/java/code/docs/transactor/Message.java diff --git a/akka-docs/java/code/docs/transactor/TransactorDocJavaSpec.scala b/akka-docs/rst/java/code/docs/transactor/TransactorDocJavaSpec.scala similarity index 100% rename from akka-docs/java/code/docs/transactor/TransactorDocJavaSpec.scala rename to akka-docs/rst/java/code/docs/transactor/TransactorDocJavaSpec.scala diff --git a/akka-docs/java/code/docs/transactor/TransactorDocTest.java b/akka-docs/rst/java/code/docs/transactor/TransactorDocTest.java similarity index 100% rename from akka-docs/java/code/docs/transactor/TransactorDocTest.java rename to akka-docs/rst/java/code/docs/transactor/TransactorDocTest.java diff --git a/akka-docs/java/code/docs/zeromq/ZeromqDocTest.scala b/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTest.scala similarity index 100% rename from akka-docs/java/code/docs/zeromq/ZeromqDocTest.scala rename to akka-docs/rst/java/code/docs/zeromq/ZeromqDocTest.scala diff --git a/akka-docs/java/code/docs/zeromq/ZeromqDocTestBase.java b/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java similarity index 100% rename from akka-docs/java/code/docs/zeromq/ZeromqDocTestBase.java rename to akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java diff --git a/akka-docs/java/dispatchers.rst b/akka-docs/rst/java/dispatchers.rst similarity index 100% rename from akka-docs/java/dispatchers.rst rename to akka-docs/rst/java/dispatchers.rst diff --git a/akka-docs/java/event-bus.rst b/akka-docs/rst/java/event-bus.rst similarity index 100% rename from akka-docs/java/event-bus.rst rename to akka-docs/rst/java/event-bus.rst diff --git a/akka-docs/java/extending-akka.rst b/akka-docs/rst/java/extending-akka.rst similarity index 100% rename from akka-docs/java/extending-akka.rst rename to akka-docs/rst/java/extending-akka.rst diff --git a/akka-docs/java/fault-tolerance-sample.rst b/akka-docs/rst/java/fault-tolerance-sample.rst similarity index 100% rename from akka-docs/java/fault-tolerance-sample.rst rename to akka-docs/rst/java/fault-tolerance-sample.rst diff --git a/akka-docs/java/fault-tolerance.rst b/akka-docs/rst/java/fault-tolerance.rst similarity index 100% rename from akka-docs/java/fault-tolerance.rst rename to akka-docs/rst/java/fault-tolerance.rst diff --git a/akka-docs/java/fsm.rst b/akka-docs/rst/java/fsm.rst similarity index 100% rename from akka-docs/java/fsm.rst rename to akka-docs/rst/java/fsm.rst diff --git a/akka-docs/java/futures.rst b/akka-docs/rst/java/futures.rst similarity index 100% rename from akka-docs/java/futures.rst rename to akka-docs/rst/java/futures.rst diff --git a/akka-docs/java/howto.rst b/akka-docs/rst/java/howto.rst similarity index 100% rename from akka-docs/java/howto.rst rename to akka-docs/rst/java/howto.rst diff --git a/akka-docs/java/index.rst b/akka-docs/rst/java/index.rst similarity index 100% rename from akka-docs/java/index.rst rename to akka-docs/rst/java/index.rst diff --git a/akka-docs/java/logging.rst b/akka-docs/rst/java/logging.rst similarity index 100% rename from akka-docs/java/logging.rst rename to akka-docs/rst/java/logging.rst diff --git a/akka-docs/java/microkernel.rst b/akka-docs/rst/java/microkernel.rst similarity index 90% rename from akka-docs/java/microkernel.rst rename to akka-docs/rst/java/microkernel.rst index 970b174549..3d89c5c7e6 100644 --- a/akka-docs/java/microkernel.rst +++ b/akka-docs/rst/java/microkernel.rst @@ -36,7 +36,7 @@ On a Windows machine you can also use the bin/akka.bat script. The code for the Hello Kernel example (see the ``HelloKernel`` class for an example of creating a Bootable): -.. includecode:: ../../akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java +.. includecode:: ../../../akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java Distribution of microkernel application @@ -48,12 +48,12 @@ start scripts. To use the sbt plugin you define it in your ``project/plugins.sbt``: -.. includecode:: ../../akka-sbt-plugin/sample/project/plugins.sbt +.. includecode:: ../../../akka-sbt-plugin/sample/project/plugins.sbt Then you add it to the settings of your ``project/Build.scala``. It is also important that you add the ``akka-kernel`` dependency. This is an example of a complete sbt build file: -.. includecode:: ../../akka-sbt-plugin/sample/project/Build.scala +.. includecode:: ../../../akka-sbt-plugin/sample/project/Build.scala Run the plugin with sbt:: diff --git a/akka-docs/java/remoting.rst b/akka-docs/rst/java/remoting.rst similarity index 89% rename from akka-docs/java/remoting.rst rename to akka-docs/rst/java/remoting.rst index 3da0116ab7..e4c3d4b88f 100644 --- a/akka-docs/java/remoting.rst +++ b/akka-docs/rst/java/remoting.rst @@ -13,8 +13,8 @@ The Akka remoting is a separate jar file. Make sure that you have the following com.typesafe.akka - akka-remote - 2.1-SNAPSHOT + akka-remote_@binVersion@ + @version@ To enable remote capabilities in your Akka project you should, at a minimum, add the following changes @@ -57,7 +57,7 @@ The example above only illustrates the bare minimum of properties you have to ad There are lots of more properties that are related to remoting in Akka. We refer to the following reference file for more information: -.. literalinclude:: ../../akka-remote/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-remote/src/main/resources/reference.conf :language: none Looking up Remote Actors @@ -192,7 +192,7 @@ This sample demonstrates both, remote deployment and look-up of remote actors. First, let us have a look at the common setup for both scenarios (this is ``common.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/common.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/common.conf This enables the remoting by installing the :class:`RemoteActorRefProvider` and chooses the default remote transport. All other options will be set @@ -212,39 +212,39 @@ In order to look up a remote actor, that one must be created first. For this purpose, we configure an actor system to listen on port 2552 (this is a snippet from ``application.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: calculator Then the actor must be created. For all code which follows, assume these imports: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java :include: imports The actor doing the work will be this one: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JSimpleCalculatorActor.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JSimpleCalculatorActor.java :include: actor and we start it within an actor system using the above configuration -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCalculatorApplication.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCalculatorApplication.java :include: setup With the service actor up and running, we may look it up from another actor system, which will be configured to use port 2553 (this is a snippet from ``application.conf``). -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: remotelookup The actor which will query the calculator is a quite simple one for demonstration purposes -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupActor.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupActor.java :include: actor and it is created from an actor system using the aforementioned client’s config. -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java :include: setup Requests which come in via ``doSomething`` will be sent to the client actor @@ -260,27 +260,27 @@ Creating remote actors instead of looking them up is not visible in the source code, only in the configuration file. This section is used in this scenario (this is a snippet from ``application.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: remotecreation For all code which follows, assume these imports: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JLookupApplication.java :include: imports The server actor can multiply or divide numbers: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JAdvancedCalculatorActor.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JAdvancedCalculatorActor.java :include: actor The client actor looks like in the previous example -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCreationActor.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCreationActor.java :include: actor but the setup uses only ``actorOf``: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCreationApplication.java +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/java/sample/remote/calculator/java/JCreationApplication.java :include: setup Observe how the name of the server actor matches the deployment given in the diff --git a/akka-docs/java/routing.rst b/akka-docs/rst/java/routing.rst similarity index 100% rename from akka-docs/java/routing.rst rename to akka-docs/rst/java/routing.rst diff --git a/akka-docs/java/scheduler.rst b/akka-docs/rst/java/scheduler.rst similarity index 89% rename from akka-docs/java/scheduler.rst rename to akka-docs/rst/java/scheduler.rst index 28da7feeca..96b6934506 100644 --- a/akka-docs/java/scheduler.rst +++ b/akka-docs/rst/java/scheduler.rst @@ -37,14 +37,14 @@ Some examples From ``akka.actor.ActorSystem`` ------------------------------- -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/ActorSystem.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/ActorSystem.scala :include: scheduler The Scheduler interface ----------------------- -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/Scheduler.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala :include: scheduler The Cancellable interface @@ -55,6 +55,6 @@ This allows you to ``cancel`` something that has been scheduled for execution. .. warning:: This does not abort the execution of the task, if it had already been started. -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/Scheduler.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala :include: cancellable diff --git a/akka-docs/java/serialization.rst b/akka-docs/rst/java/serialization.rst similarity index 100% rename from akka-docs/java/serialization.rst rename to akka-docs/rst/java/serialization.rst diff --git a/akka-docs/java/stm.rst b/akka-docs/rst/java/stm.rst similarity index 100% rename from akka-docs/java/stm.rst rename to akka-docs/rst/java/stm.rst diff --git a/akka-docs/java/testing.rst b/akka-docs/rst/java/testing.rst similarity index 100% rename from akka-docs/java/testing.rst rename to akka-docs/rst/java/testing.rst diff --git a/akka-docs/java/transactors.rst b/akka-docs/rst/java/transactors.rst similarity index 100% rename from akka-docs/java/transactors.rst rename to akka-docs/rst/java/transactors.rst diff --git a/akka-docs/java/typed-actors.rst b/akka-docs/rst/java/typed-actors.rst similarity index 100% rename from akka-docs/java/typed-actors.rst rename to akka-docs/rst/java/typed-actors.rst diff --git a/akka-docs/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst similarity index 100% rename from akka-docs/java/untyped-actors.rst rename to akka-docs/rst/java/untyped-actors.rst diff --git a/akka-docs/java/zeromq.rst b/akka-docs/rst/java/zeromq.rst similarity index 100% rename from akka-docs/java/zeromq.rst rename to akka-docs/rst/java/zeromq.rst diff --git a/akka-docs/modules/camel-async-interact.png b/akka-docs/rst/modules/camel-async-interact.png similarity index 100% rename from akka-docs/modules/camel-async-interact.png rename to akka-docs/rst/modules/camel-async-interact.png diff --git a/akka-docs/modules/camel-async-sequence.png b/akka-docs/rst/modules/camel-async-sequence.png similarity index 100% rename from akka-docs/modules/camel-async-sequence.png rename to akka-docs/rst/modules/camel-async-sequence.png diff --git a/akka-docs/modules/camel-custom-route.png b/akka-docs/rst/modules/camel-custom-route.png similarity index 100% rename from akka-docs/modules/camel-custom-route.png rename to akka-docs/rst/modules/camel-custom-route.png diff --git a/akka-docs/modules/camel-pubsub.png b/akka-docs/rst/modules/camel-pubsub.png similarity index 100% rename from akka-docs/modules/camel-pubsub.png rename to akka-docs/rst/modules/camel-pubsub.png diff --git a/akka-docs/modules/camel-pubsub2.png b/akka-docs/rst/modules/camel-pubsub2.png similarity index 100% rename from akka-docs/modules/camel-pubsub2.png rename to akka-docs/rst/modules/camel-pubsub2.png diff --git a/akka-docs/modules/camel.rst b/akka-docs/rst/modules/camel.rst similarity index 100% rename from akka-docs/modules/camel.rst rename to akka-docs/rst/modules/camel.rst diff --git a/akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala b/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala similarity index 100% rename from akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala rename to akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala diff --git a/akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocTest.scala b/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocTest.scala similarity index 100% rename from akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocTest.scala rename to akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocTest.scala diff --git a/akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocTestBase.java b/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocTestBase.java similarity index 100% rename from akka-docs/modules/code/docs/actor/mailbox/DurableMailboxDocTestBase.java rename to akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocTestBase.java diff --git a/akka-docs/modules/durable-mailbox.rst b/akka-docs/rst/modules/durable-mailbox.rst similarity index 97% rename from akka-docs/modules/durable-mailbox.rst rename to akka-docs/rst/modules/durable-mailbox.rst index 5be40320d0..794ff0e751 100644 --- a/akka-docs/modules/durable-mailbox.rst +++ b/akka-docs/rst/modules/durable-mailbox.rst @@ -68,7 +68,7 @@ Corresponding example in Java: You can also configure and tune the file-based durable mailbox. This is done in the ``akka.actor.mailbox.file-based`` section in the :ref:`configuration`. -.. literalinclude:: ../../akka-durable-mailboxes/akka-file-mailbox/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-durable-mailboxes/akka-file-mailbox/src/main/resources/reference.conf :language: none How to implement a durable mailbox diff --git a/akka-docs/modules/http.rst b/akka-docs/rst/modules/http.rst similarity index 100% rename from akka-docs/modules/http.rst rename to akka-docs/rst/modules/http.rst diff --git a/akka-docs/modules/index.rst b/akka-docs/rst/modules/index.rst similarity index 100% rename from akka-docs/modules/index.rst rename to akka-docs/rst/modules/index.rst diff --git a/akka-docs/project/index.rst b/akka-docs/rst/project/index.rst similarity index 100% rename from akka-docs/project/index.rst rename to akka-docs/rst/project/index.rst diff --git a/akka-docs/project/issue-tracking.rst b/akka-docs/rst/project/issue-tracking.rst similarity index 100% rename from akka-docs/project/issue-tracking.rst rename to akka-docs/rst/project/issue-tracking.rst diff --git a/akka-docs/project/licenses.rst b/akka-docs/rst/project/licenses.rst similarity index 100% rename from akka-docs/project/licenses.rst rename to akka-docs/rst/project/licenses.rst diff --git a/akka-docs/project/links.rst b/akka-docs/rst/project/links.rst similarity index 90% rename from akka-docs/project/links.rst rename to akka-docs/rst/project/links.rst index 3002dc1216..238971d1ba 100644 --- a/akka-docs/project/links.rst +++ b/akka-docs/rst/project/links.rst @@ -57,7 +57,7 @@ http://repo.typesafe.com/typesafe/snapshots/ as both ``SNAPSHOT`` and timestamped versions. For timestamped versions, pick a timestamp from -http://repo.typesafe.com/typesafe/snapshots/com/typesafe/akka/akka-actor/. +http://repo.typesafe.com/typesafe/snapshots/com/typesafe/akka/akka-actor_@binVersion@/. All Akka modules that belong to the same build have the same timestamp. Make sure that you add the repository to the sbt resolvers or maven repositories:: @@ -66,6 +66,6 @@ Make sure that you add the repository to the sbt resolvers or maven repositories Define the library dependencies with the timestamp as version. For example:: - libraryDependencies += "com.typesafe.akka" % "akka-actor" % "2.0-20111215-000549" + libraryDependencies += "com.typesafe.akka" % "akka-actor_@binVersion@" % "2.1-20120913-000917" - libraryDependencies += "com.typesafe.akka" % "akka-remote" % "2.0-20111215-000549" + libraryDependencies += "com.typesafe.akka" % "akka-remote_@binVersion@" % "2.1-20120913-000917" diff --git a/akka-docs/project/migration-guide-1.3.x-2.0.x.rst b/akka-docs/rst/project/migration-guide-1.3.x-2.0.x.rst similarity index 100% rename from akka-docs/project/migration-guide-1.3.x-2.0.x.rst rename to akka-docs/rst/project/migration-guide-1.3.x-2.0.x.rst diff --git a/akka-docs/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst similarity index 99% rename from akka-docs/project/migration-guide-2.0.x-2.1.x.rst rename to akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index ec04dacdda..f5fa272ed2 100644 --- a/akka-docs/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -15,11 +15,7 @@ migrating `1.3.x to 2.0.x + */ +package docs.routing + +import akka.actor.{ Actor, Props, ActorSystem } +import com.typesafe.config.ConfigFactory +import akka.routing.FromConfig + +case class Message(nbr: Int) + +class ExampleActor extends Actor { + def receive = { + case Message(nbr) ⇒ println("Received %s in router %s".format(nbr, self.path.name)) + } +} + +object RouterWithConfigExample extends App { + val config = ConfigFactory.parseString(""" + //#config + akka.actor.deployment { + /router { + router = round-robin + nr-of-instances = 5 + } + } + //#config + //#config-resize + akka.actor.deployment { + /router2 { + router = round-robin + resizer { + lower-bound = 2 + upper-bound = 15 + } + } + } + //#config-resize + """) + val system = ActorSystem("Example", config) + //#configurableRouting + val router = system.actorOf(Props[ExampleActor].withRouter(FromConfig()), + "router") + //#configurableRouting + 1 to 10 foreach { i ⇒ router ! Message(i) } + + //#configurableRoutingWithResizer + val router2 = system.actorOf(Props[ExampleActor].withRouter(FromConfig()), + "router2") + //#configurableRoutingWithResizer + 1 to 10 foreach { i ⇒ router2 ! Message(i) } +} \ No newline at end of file diff --git a/akka-docs/scala/code/docs/routing/RouterViaProgramExample.scala b/akka-docs/rst/scala/code/docs/routing/RouterViaProgramExample.scala similarity index 100% rename from akka-docs/scala/code/docs/routing/RouterViaProgramExample.scala rename to akka-docs/rst/scala/code/docs/routing/RouterViaProgramExample.scala diff --git a/akka-docs/scala/code/docs/serialization/SerializationDocSpec.scala b/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/serialization/SerializationDocSpec.scala rename to akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala diff --git a/akka-docs/scala/code/docs/testkit/PlainWordSpec.scala b/akka-docs/rst/scala/code/docs/testkit/PlainWordSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/testkit/PlainWordSpec.scala rename to akka-docs/rst/scala/code/docs/testkit/PlainWordSpec.scala diff --git a/akka-docs/scala/code/docs/testkit/TestKitUsageSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/testkit/TestKitUsageSpec.scala rename to akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala diff --git a/akka-docs/scala/code/docs/testkit/TestkitDocSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/testkit/TestkitDocSpec.scala rename to akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala diff --git a/akka-docs/scala/code/docs/transactor/TransactorDocSpec.scala b/akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/transactor/TransactorDocSpec.scala rename to akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala diff --git a/akka-docs/scala/code/docs/zeromq/ZeromqDocSpec.scala b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala similarity index 100% rename from akka-docs/scala/code/docs/zeromq/ZeromqDocSpec.scala rename to akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala diff --git a/akka-docs/scala/dataflow.rst b/akka-docs/rst/scala/dataflow.rst similarity index 97% rename from akka-docs/scala/dataflow.rst rename to akka-docs/rst/scala/dataflow.rst index 804cb7d196..c6185257c2 100644 --- a/akka-docs/scala/dataflow.rst +++ b/akka-docs/rst/scala/dataflow.rst @@ -25,7 +25,7 @@ Scala's Delimited Continuations plugin is required to use the Dataflow API. To e autoCompilerPlugins := true, libraryDependencies <+= scalaVersion { - v => compilerPlugin("org.scala-lang.plugins" % "continuations" % ) + v => compilerPlugin("org.scala-lang.plugins" % "continuations" % @scalaVersion@) }, scalacOptions += "-P:continuations:enable", @@ -34,7 +34,7 @@ You will also need to include a dependency on ``akka-dataflow``: .. code-block:: scala - "com.typesafe.akka" %% "akka-dataflow" % "2.1-SNAPSHOT" cross CrossVersion.full + "com.typesafe.akka" %% "akka-dataflow" % "@version@" @crossString@ Dataflow variables ------------------ @@ -108,3 +108,4 @@ Conclusions: - Dataflow has a smaller code footprint and arguably is easier to reason about. - For-comprehensions are more general than Dataflow, and can operate on a wide array of types. + diff --git a/akka-docs/scala/dispatchers.rst b/akka-docs/rst/scala/dispatchers.rst similarity index 100% rename from akka-docs/scala/dispatchers.rst rename to akka-docs/rst/scala/dispatchers.rst diff --git a/akka-docs/scala/event-bus.rst b/akka-docs/rst/scala/event-bus.rst similarity index 100% rename from akka-docs/scala/event-bus.rst rename to akka-docs/rst/scala/event-bus.rst diff --git a/akka-docs/scala/extending-akka.rst b/akka-docs/rst/scala/extending-akka.rst similarity index 100% rename from akka-docs/scala/extending-akka.rst rename to akka-docs/rst/scala/extending-akka.rst diff --git a/akka-docs/scala/fault-tolerance-sample.rst b/akka-docs/rst/scala/fault-tolerance-sample.rst similarity index 100% rename from akka-docs/scala/fault-tolerance-sample.rst rename to akka-docs/rst/scala/fault-tolerance-sample.rst diff --git a/akka-docs/scala/fault-tolerance.rst b/akka-docs/rst/scala/fault-tolerance.rst similarity index 100% rename from akka-docs/scala/fault-tolerance.rst rename to akka-docs/rst/scala/fault-tolerance.rst diff --git a/akka-docs/scala/fsm.rst b/akka-docs/rst/scala/fsm.rst similarity index 100% rename from akka-docs/scala/fsm.rst rename to akka-docs/rst/scala/fsm.rst diff --git a/akka-docs/scala/futures.rst b/akka-docs/rst/scala/futures.rst similarity index 100% rename from akka-docs/scala/futures.rst rename to akka-docs/rst/scala/futures.rst diff --git a/akka-docs/scala/howto.rst b/akka-docs/rst/scala/howto.rst similarity index 79% rename from akka-docs/scala/howto.rst rename to akka-docs/rst/scala/howto.rst index bcaa456b82..7d064e2491 100644 --- a/akka-docs/scala/howto.rst +++ b/akka-docs/rst/scala/howto.rst @@ -21,7 +21,7 @@ Contributed by: Kaspar Fischer "A message throttler that ensures that messages are not sent out at too high a rate." -The pattern is described `here `_. +The pattern is described in `Throttling Messages in Akka 2 `_. Balancing Workload Across Nodes =============================== @@ -32,7 +32,7 @@ Contributed by: Derek Wyatt stipulation that the Actors doing the work have distinct Mailboxes on remote nodes. In this post we’ll explore the implementation of such a concept." -The pattern is described `here `_. +The pattern is described `Balancing Workload across Nodes with Akka 2 `_. Ordered Termination =================== @@ -46,7 +46,7 @@ If an Actor has children that have order dependencies, then you might need to en a particular shutdown order of those children so that their postStop() methods get called in the right order." -The pattern is described `here `_. +The pattern is described `An Akka 2 Terminator `_. Akka AMQP Proxies ================= @@ -57,7 +57,7 @@ Contributed by: Fabrice Drouin You still write “local” code, have very little to configure, and end up with a distributed, elastic, fault-tolerant grid where computing nodes can be written in nearly every programming language." -The pattern is described `here `_. +The pattern is described `Akka AMQP Proxies `_. Shutdown Patterns in Akka 2 =========================== @@ -72,7 +72,7 @@ She’s just plain mean. In this post, we’ll discuss why this is the case and provide you with a simple option for shutting down “at the right time”, as well as a not-so-simple-option for doing the exact same thing." -The pattern is described `here `_. +The pattern is described `Shutdown Patterns in Akka 2 `_. Distributed (in-memory) graph processing with Akka ================================================== @@ -83,7 +83,7 @@ Contributed by: Adelbert Chang and have become even more interesting in the context of online social networks such as Facebook and Twitter, whose underlying network structures are nicely represented by graphs." -The pattern is described `here `_. +The pattern is described `Distributed In-Memory Graph Processing with Akka `_. Case Study: An Auto-Updating Cache Using Actors =============================================== @@ -96,7 +96,7 @@ The data in the backend system is constantly being updated so the caches need to Requests to the backend system need to be throttled. The caching system we built used Akka actors and Scala’s support for functions as first class objects." -The pattern is described `here `_. +The pattern is described `Case Study: An Auto-Updating Cache using Actors `_. Discovering message flows in actor systems with the Spider Pattern ================================================================== @@ -109,7 +109,7 @@ on several machines to find out what’s going on. I’m sure you have browsed t This is where the Spider pattern comes in." -The pattern is described `here `_. +The pattern is described `Discovering Message Flows in Actor System with the Spider Pattern `_. Template Pattern ================ diff --git a/akka-docs/scala/index.rst b/akka-docs/rst/scala/index.rst similarity index 100% rename from akka-docs/scala/index.rst rename to akka-docs/rst/scala/index.rst diff --git a/akka-docs/scala/io.rst b/akka-docs/rst/scala/io.rst similarity index 100% rename from akka-docs/scala/io.rst rename to akka-docs/rst/scala/io.rst diff --git a/akka-docs/scala/logging.rst b/akka-docs/rst/scala/logging.rst similarity index 100% rename from akka-docs/scala/logging.rst rename to akka-docs/rst/scala/logging.rst diff --git a/akka-docs/scala/microkernel.rst b/akka-docs/rst/scala/microkernel.rst similarity index 90% rename from akka-docs/scala/microkernel.rst rename to akka-docs/rst/scala/microkernel.rst index c2bc95cb8b..c223f9dd45 100644 --- a/akka-docs/scala/microkernel.rst +++ b/akka-docs/rst/scala/microkernel.rst @@ -36,7 +36,7 @@ On a Windows machine you can also use the bin/akka.bat script. The code for the Hello Kernel example (see the ``HelloKernel`` class for an example of creating a Bootable): -.. includecode:: ../../akka-samples/akka-sample-hello-kernel/src/main/scala/sample/kernel/hello/HelloKernel.scala +.. includecode:: ../../../akka-samples/akka-sample-hello-kernel/src/main/scala/sample/kernel/hello/HelloKernel.scala Distribution of microkernel application @@ -48,12 +48,12 @@ start scripts. To use the sbt plugin you define it in your ``project/plugins.sbt``: -.. includecode:: ../../akka-sbt-plugin/sample/project/plugins.sbt +.. includecode:: ../../../akka-sbt-plugin/sample/project/plugins.sbt Then you add it to the settings of your ``project/Build.scala``. It is also important that you add the ``akka-kernel`` dependency. This is an example of a complete sbt build file: -.. includecode:: ../../akka-sbt-plugin/sample/project/Build.scala +.. includecode:: ../../../akka-sbt-plugin/sample/project/Build.scala Run the plugin with sbt:: diff --git a/akka-docs/scala/remoting.rst b/akka-docs/rst/scala/remoting.rst similarity index 90% rename from akka-docs/scala/remoting.rst rename to akka-docs/rst/scala/remoting.rst index 9e11412ef1..41f241ada0 100644 --- a/akka-docs/scala/remoting.rst +++ b/akka-docs/rst/scala/remoting.rst @@ -12,7 +12,7 @@ Preparing your ActorSystem for Remoting The Akka remoting is a separate jar file. Make sure that you have the following dependency in your project:: - "com.typesafe.akka" % "akka-remote" % "2.1-SNAPSHOT" + "com.typesafe.akka" %% "akka-remote" % "@version@" @crossString@ To enable remote capabilities in your Akka project you should, at a minimum, add the following changes to your ``application.conf`` file:: @@ -54,7 +54,7 @@ The example above only illustrates the bare minimum of properties you have to ad There are lots of more properties that are related to remoting in Akka. We refer to the following reference file for more information: -.. literalinclude:: ../../akka-remote/src/main/resources/reference.conf +.. literalinclude:: ../../../akka-remote/src/main/resources/reference.conf :language: none Types of Remote Interaction @@ -201,7 +201,7 @@ This sample demonstrates both, remote deployment and look-up of remote actors. First, let us have a look at the common setup for both scenarios (this is ``common.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/common.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/common.conf This enables the remoting by installing the :class:`RemoteActorRefProvider` and chooses the default remote transport. All other options will be set @@ -221,39 +221,39 @@ In order to look up a remote actor, that one must be created first. For this purpose, we configure an actor system to listen on port 2552 (this is a snippet from ``application.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: calculator Then the actor must be created. For all code which follows, assume these imports: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala :include: imports The actor doing the work will be this one: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CalculatorApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CalculatorApplication.scala :include: actor and we start it within an actor system using the above configuration -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CalculatorApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CalculatorApplication.scala :include: setup With the service actor up and running, we may look it up from another actor system, which will be configured to use port 2553 (this is a snippet from ``application.conf``). -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: remotelookup The actor which will query the calculator is a quite simple one for demonstration purposes -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala :include: actor and it is created from an actor system using the aforementioned client’s config. -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala :include: setup Requests which come in via ``doSomething`` will be sent to the client actor @@ -269,22 +269,22 @@ Creating remote actors instead of looking them up is not visible in the source code, only in the configuration file. This section is used in this scenario (this is a snippet from ``application.conf``): -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/resources/application.conf +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/resources/application.conf :include: remotecreation For all code which follows, assume these imports: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala :include: imports The client actor looks like in the previous example -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala :include: actor but the setup uses only ``actorOf``: -.. includecode:: ../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala +.. includecode:: ../../../akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala :include: setup Observe how the name of the server actor matches the deployment given in the diff --git a/akka-docs/scala/routing.rst b/akka-docs/rst/scala/routing.rst similarity index 97% rename from akka-docs/scala/routing.rst rename to akka-docs/rst/scala/routing.rst index c1fa21b23f..9dc356c98c 100644 --- a/akka-docs/scala/routing.rst +++ b/akka-docs/rst/scala/routing.rst @@ -126,7 +126,7 @@ not have an effect on the number of actors in the pool. Setting the strategy is easily done: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#supervision +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#supervision :include: supervision :exclude: custom-strategy @@ -378,12 +378,12 @@ democrat related messages to the Democrat actor and all republican related messa We begin with defining the class: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRouter +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRouter :exclude: crRoute The next step is to implement the ``createRoute`` method in the class just defined: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRoute +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRoute As you can see above we start off by creating the routees and put them in a collection. @@ -392,12 +392,12 @@ It registers the routees internally and failing to call this method will cause a ``ActorInitializationException`` to be thrown when the router is used. Therefore always make sure to do the following in your custom router: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRegisterRoutees +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRegisterRoutees The routing logic is where your magic sauce is applied. In our example it inspects the message types and forwards to the correct routee based on this: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRoutingLogic +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#crRoutingLogic As you can see above what's returned in the partial function is a ``List`` of ``Destination(sender, routee)``. The sender is what "parent" the routee should see - changing this could be useful if you for example want @@ -407,7 +407,7 @@ For more information about how to alter the original sender we refer to the sour All in all the custom router looks like this: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#CustomRouter +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala#CustomRouter If you are interested in how to use the VoteCountRouter you can have a look at the test class `RoutingSpec `_ diff --git a/akka-docs/scala/scheduler.rst b/akka-docs/rst/scala/scheduler.rst similarity index 89% rename from akka-docs/scala/scheduler.rst rename to akka-docs/rst/scala/scheduler.rst index 0a5b8aed51..e221752fac 100644 --- a/akka-docs/scala/scheduler.rst +++ b/akka-docs/rst/scala/scheduler.rst @@ -37,14 +37,14 @@ Some examples From ``akka.actor.ActorSystem`` ------------------------------- -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/ActorSystem.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/ActorSystem.scala :include: scheduler The Scheduler interface ----------------------- -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/Scheduler.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala :include: scheduler The Cancellable interface @@ -55,6 +55,6 @@ This allows you to ``cancel`` something that has been scheduled for execution. .. warning:: This does not abort the execution of the task, if it had already been started. -.. includecode:: ../../akka-actor/src/main/scala/akka/actor/Scheduler.scala +.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala :include: cancellable diff --git a/akka-docs/scala/serialization.rst b/akka-docs/rst/scala/serialization.rst similarity index 100% rename from akka-docs/scala/serialization.rst rename to akka-docs/rst/scala/serialization.rst diff --git a/akka-docs/scala/stm.rst b/akka-docs/rst/scala/stm.rst similarity index 100% rename from akka-docs/scala/stm.rst rename to akka-docs/rst/scala/stm.rst diff --git a/akka-docs/scala/testing.rst b/akka-docs/rst/scala/testing.rst similarity index 99% rename from akka-docs/scala/testing.rst rename to akka-docs/rst/scala/testing.rst index 1c7daa26f8..fadf39a2d8 100644 --- a/akka-docs/scala/testing.rst +++ b/akka-docs/rst/scala/testing.rst @@ -473,7 +473,7 @@ keep a test running and verify traces later you can also install an This code can be used to forward messages, e.g. in a chain ``A --> Probe --> B``, as long as a certain protocol is obeyed. -.. includecode:: ../../akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala#autopilot +.. includecode:: ../../../akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala#autopilot The :meth:`run` method must return the auto-pilot for the next message, which may be :class:`KeepRunning` to retain the current one or :class:`NoAutoPilot` @@ -722,11 +722,11 @@ Testing Custom Router Logic Given the following custom (dummy) router: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala#custom-router +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala#custom-router This might be tested by dispatching messages and asserting their reception at the right destinations, but that can be inconvenient. Therefore exists the :obj:`ExtractRoute` extractor, which can be used like so: -.. includecode:: ../../akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala#test-route +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala#test-route diff --git a/akka-docs/scala/testkit-example.rst b/akka-docs/rst/scala/testkit-example.rst similarity index 100% rename from akka-docs/scala/testkit-example.rst rename to akka-docs/rst/scala/testkit-example.rst diff --git a/akka-docs/scala/transactors.rst b/akka-docs/rst/scala/transactors.rst similarity index 100% rename from akka-docs/scala/transactors.rst rename to akka-docs/rst/scala/transactors.rst diff --git a/akka-docs/scala/typed-actors.rst b/akka-docs/rst/scala/typed-actors.rst similarity index 100% rename from akka-docs/scala/typed-actors.rst rename to akka-docs/rst/scala/typed-actors.rst diff --git a/akka-docs/scala/zeromq.rst b/akka-docs/rst/scala/zeromq.rst similarity index 100% rename from akka-docs/scala/zeromq.rst rename to akka-docs/rst/scala/zeromq.rst diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index e818a52613..d2922e800e 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -15,7 +15,7 @@ import com.typesafe.tools.mima.plugin.MimaPlugin.mimaDefaultSettings import com.typesafe.tools.mima.plugin.MimaKeys.previousArtifact import java.lang.Boolean.getBoolean import sbt.Tests -import Sphinx.{ sphinxDocs, sphinxHtml, sphinxLatex, sphinxPdf, sphinxPygments, sphinxTags } +import Sphinx.{ sphinxDocs, sphinxHtml, sphinxLatex, sphinxPdf, sphinxPygments, sphinxTags, sphinxVars, sphinxExts } object AkkaBuild extends Build { System.setProperty("akka.mode", "test") // Is there better place for this? @@ -31,7 +31,7 @@ object AkkaBuild extends Build { id = "akka", base = file("."), settings = parentSettings ++ Release.settings ++ Unidoc.settings ++ Sphinx.settings ++ Publish.versionSettings ++ - Dist.settings ++ mimaSettings ++ Seq( + Dist.settings ++ mimaSettings ++ sphinxReplacements ++ Seq( testMailbox in GlobalScope := System.getProperty("akka.testMailbox", "false").toBoolean, parallelExecution in GlobalScope := System.getProperty("akka.parallelExecution", "false").toBoolean, Publish.defaultPublishTo in ThisBuild <<= crossTarget / "repository", @@ -63,8 +63,9 @@ object AkkaBuild extends Build { * line (without it, the pygments task would run twice in parallel for * the same directory, wreaking the expected amount of havoc). */ - sphinxDocs <<= baseDirectory / "akka-docs", + sphinxDocs <<= baseDirectory / "akka-docs/rst", sphinxTags in sphinxHtml += "online", + sphinxHtml <<= (sphinxHtml, sphinxHtml in LocalProject(docs.id)) map ((orig, dummy) => orig), // make akka-docs run first sphinxPygments <<= sphinxPygments in LocalProject(docs.id) map identity, sphinxLatex <<= sphinxLatex in LocalProject(docs.id) map identity, sphinxPdf <<= sphinxPdf in LocalProject(docs.id) map identity @@ -348,7 +349,7 @@ object AkkaBuild extends Build { base = file("akka-docs"), dependencies = Seq(actor, testkit % "test->test", mailboxesCommon % "compile;test->test", remote, cluster, slf4j, agent, dataflow, transactor, fileMailbox, zeroMQ, camel, osgi, osgiAries), - settings = defaultSettings ++ Sphinx.settings ++ Seq( + settings = defaultSettings ++ Sphinx.settings ++ sphinxReplacements ++ Seq( unmanagedSourceDirectories in Test <<= baseDirectory { _ ** "code" get }, libraryDependencies ++= Dependencies.docs, unmanagedSourceDirectories in ScalariformKeys.format in Test <<= unmanagedSourceDirectories in Test, @@ -468,6 +469,29 @@ object AkkaBuild extends Build { testOptions in Test += Tests.Argument("-oDF") ) + lazy val sphinxReplacements = Seq( + sphinxVars <<= (scalaVersion, version) { (s, v) => + val BinVer = """(\d+\.\d+)\.\d+""".r + Map( + "version" -> v, + "scalaVersion" -> s, + "crossString" -> (s match { + case BinVer(_) => "" + case _ => "cross CrossVersion.full" + }), + "jarName" -> (s match { + case BinVer(bv) => "akka-actor_" + bv + "-" + v + ".jar" + case _ => "akka-actor_" + s + "-" + v + ".jar" + }), + "binVersion" -> (s match { + case BinVer(bv) => bv + case _ => s + }) + ) + }, + sphinxExts += "py" + ) + lazy val formatSettings = ScalariformPlugin.scalariformSettings ++ Seq( ScalariformKeys.preferences in Compile := formattingPreferences, ScalariformKeys.preferences in Test := formattingPreferences diff --git a/project/Sphinx.scala b/project/Sphinx.scala index b349265b60..31dfd124ed 100644 --- a/project/Sphinx.scala +++ b/project/Sphinx.scala @@ -6,40 +6,36 @@ package akka import sbt._ import sbt.Keys._ -import java.io.File +import java.io.{ File, PrintWriter } object Sphinx { val sphinxDocs = SettingKey[File]("sphinx-docs") val sphinxTarget = SettingKey[File]("sphinx-target") - val sphinxScalaVersion = TaskKey[String]("sphinx-scala-version") val sphinxPygmentsDir = SettingKey[File]("sphinx-pygments-dir") val sphinxTags = SettingKey[Seq[String]]("sphinx-tags") val sphinxPygments = TaskKey[File]("sphinx-pygments", "Sphinx: install pygments styles") val sphinxHtml = TaskKey[File]("sphinx-html", "Sphinx: HTML documentation.") val sphinxLatex = TaskKey[File]("sphinx-latex", "Sphinx: Latex documentation.") val sphinxPdf = TaskKey[File]("sphinx-pdf", "Sphinx: PDF documentation.") + val sphinxVars = SettingKey[Map[String, String]]("sphinx-vars", "mappings key->value to be replaced within docs") + val sphinxExts = SettingKey[Set[String]]("sphinx-exts", "file extensions which will be filtered for replacements") val sphinx = TaskKey[File]("sphinx", "Build all Sphinx documentation (HTML and PDF combined).") lazy val settings = Seq( - sphinxDocs <<= baseDirectory, + sphinxDocs <<= baseDirectory / "rst", sphinxTarget <<= crossTarget / "sphinx", - sphinxScalaVersion <<= scalaVersionTask, - sphinxPygmentsDir <<= sphinxDocs { _ / "_sphinx" / "pygments" }, + sphinxPygmentsDir <<= sphinxDocs { _ / ".." / "_sphinx" / "pygments" }, sphinxTags in sphinxHtml := Seq.empty, sphinxTags in sphinxLatex := Seq.empty, sphinxPygments <<= pygmentsTask, sphinxHtml <<= buildTask("html", sphinxTags in sphinxHtml), sphinxLatex <<= buildTask("latex", sphinxTags in sphinxLatex), sphinxPdf <<= pdfTask, + sphinxVars := Map("" -> "@"), // this default makes the @@ -> @ subst work + sphinxExts := Set("rst"), sphinx <<= sphinxTask ) - def scalaVersionTask = (scalaVersion, streams) map { (v, s) => - s.log.info("writing version file") - IO.write(file("akka-docs/epilog_rst"), ".. |scalaVersion| replace:: " + v + "\n") - v - } - def pygmentsTask = (sphinxDocs, sphinxPygmentsDir, sphinxTarget, streams) map { (cwd, pygments, baseTarget, s) => { val target = baseTarget / "site-packages" @@ -58,32 +54,52 @@ object Sphinx { } target } - } dependsOn sphinxScalaVersion + } def buildTask(builder: String, tagsKey: SettingKey[Seq[String]]) = { - (cacheDirectory, sphinxDocs, sphinxTarget, sphinxPygments, tagsKey, streams) map { - (cacheDir, docs, baseTarget, pygments, tags, s) => { + (cacheDirectory, sphinxDocs, sphinxTarget, sphinxPygments, tagsKey, streams, sphinxVars, sphinxExts) map { + (cacheDir, docs, baseTarget, pygments, tags, s, replacements, filterExt) => { val target = baseTarget / builder val doctrees = baseTarget / "doctrees" / builder + val temp = docs.getParentFile / (docs.getName + "_" + builder) val cache = cacheDir / "sphinx" / builder val cached = FileFunction.cached(cache)(FilesInfo.hash, FilesInfo.exists) { (in, out) => - val changes = in.modified - if (!changes.isEmpty) { - IO.delete(target) - val tagList = if (tags.isEmpty) "" else tags.mkString(" (", ", ", ")") - val desc = "%s%s" format (builder, tagList) - s.log.info("Building Sphinx %s documentation..." format desc) - changes.foreach(file => s.log.debug("Changed documentation source: " + file)) - val logger = newLogger(s) - val tagOptions = tags flatMap (Seq("-t", _)) - val command = Seq("sphinx-build", "-aEN", "-b", builder, "-d", doctrees.absolutePath) ++ tagOptions ++ Seq(docs.absolutePath, target.absolutePath) - val env = "PYTHONPATH" -> pygments.absolutePath - s.log.debug("Command: " + command.mkString(" ")) - val exitCode = Process(command, docs, env) ! logger - if (exitCode != 0) sys.error("Failed to build Sphinx %s documentation." format desc) - s.log.info("Sphinx %s documentation created: %s" format (desc, target)) - target.descendentsExcept("*", "").get.toSet - } else Set.empty + def dst(f: File) = temp.toPath.resolve(docs.toPath.relativize(f.toPath)).toFile + def filter(f: File) = filterExt contains f.getName.reverse.takeWhile('.' !=).reverse + val Replacer = """@(\w+)@""".r + in.removed foreach (f => IO delete dst(f)) + (in.modified ++ (in.checked -- out.checked)).toSeq.sorted foreach { f => + if (f.isFile) + if (filter(f)) { + s.log.debug("Changed documentation source: " + f) + IO.reader(f) { reader => + IO.writer(dst(f), "", IO.defaultCharset, append = false) { writer => + val wr = new PrintWriter(writer) + IO.foreachLine(reader) { line => + wr.println(Replacer.replaceAllIn(line, m => replacements.getOrElse(m.group(1), { + s.log.warn("unknown replacement " + m.group(1) + " in " + replacements) + m.group(0) + }))) + } + } + } + } else { + s.log.debug("Changed documentation source (copying): " + f) + IO.copyFile(f, dst(f)) + } + } + val tagList = if (tags.isEmpty) "" else tags.mkString(" (", ", ", ")") + val desc = "%s%s" format (builder, tagList) + s.log.info("Building Sphinx %s documentation..." format desc) + val logger = newLogger(s) + val tagOptions = tags flatMap (Seq("-t", _)) + val command = Seq("sphinx-build", "-aEN", "-b", builder, "-d", doctrees.absolutePath) ++ tagOptions ++ Seq(temp.absolutePath, target.absolutePath) + val env = "PYTHONPATH" -> pygments.absolutePath + s.log.debug("Command: " + command.mkString(" ")) + val exitCode = Process(command, docs, env) ! logger + if (exitCode != 0) sys.error("Failed to build Sphinx %s documentation." format desc) + s.log.info("Sphinx %s documentation created: %s" format (desc, target)) + temp.descendentsExcept("*", "").get.toSet } val toplevel = docs * ("*" - ".*" - "_sphinx" - "_build" - "disabled" - "target") val inputs = toplevel.descendentsExcept("*", "").get.toSet @@ -110,8 +126,13 @@ object Sphinx { def newLogger(streams: TaskStreams) = { new ProcessLogger { - def info(o: => String): Unit = streams.log.debug(o) - def error(e: => String): Unit = streams.log.debug(e) + def info(message: => String): Unit = { + val m = message + if (m contains "ERROR") streams.log.error(message) + else if (m contains "WARNING") streams.log.warn(message) + else streams.log.debug(message) + } + def error(e: => String): Unit = streams.log.warn(e) def buffer[T](f: => T): T = f } } From 03d968b10ec3b2f98b7f24fe7d488e859ea9822f Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 21 Sep 2012 15:53:59 +0200 Subject: [PATCH 4/9] add some comments, fix experimental status of cluster --- akka-docs/rst/cluster/cluster-usage.rst | 2 +- project/AkkaBuild.scala | 4 +++- project/Sphinx.scala | 11 ++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/cluster/cluster-usage.rst b/akka-docs/rst/cluster/cluster-usage.rst index a01aa69cc9..3c8b112bef 100644 --- a/akka-docs/rst/cluster/cluster-usage.rst +++ b/akka-docs/rst/cluster/cluster-usage.rst @@ -20,7 +20,7 @@ The Akka cluster is a separate jar file. Make sure that you have the following d If you are using the latest nightly build you should pick a timestamped Akka version from -``_. +``_. We recommend against using ``SNAPSHOT`` in order to obtain stable builds. A Simple Cluster Example diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index d2922e800e..f54d39627e 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -469,6 +469,8 @@ object AkkaBuild extends Build { testOptions in Test += Tests.Argument("-oDF") ) + // customization of sphinx @@ replacements, add to all sphinx-using projects + // add additional replacements here lazy val sphinxReplacements = Seq( sphinxVars <<= (scalaVersion, version) { (s, v) => val BinVer = """(\d+\.\d+)\.\d+""".r @@ -489,7 +491,7 @@ object AkkaBuild extends Build { }) ) }, - sphinxExts += "py" + sphinxExts += "py" // needed for transforming conf.py ) lazy val formatSettings = ScalariformPlugin.scalariformSettings ++ Seq( diff --git a/project/Sphinx.scala b/project/Sphinx.scala index 31dfd124ed..4a7dad2878 100644 --- a/project/Sphinx.scala +++ b/project/Sphinx.scala @@ -67,7 +67,12 @@ object Sphinx { def dst(f: File) = temp.toPath.resolve(docs.toPath.relativize(f.toPath)).toFile def filter(f: File) = filterExt contains f.getName.reverse.takeWhile('.' !=).reverse val Replacer = """@(\w+)@""".r + /* + * First Step: bring filtered source tree in sync with orig source tree + */ + // delete files which were removed in.removed foreach (f => IO delete dst(f)) + // transform the other files by applying the replacement map for @@ tokens (in.modified ++ (in.checked -- out.checked)).toSeq.sorted foreach { f => if (f.isFile) if (filter(f)) { @@ -84,10 +89,14 @@ object Sphinx { } } } else { + // do not transform PNGs et al s.log.debug("Changed documentation source (copying): " + f) IO.copyFile(f, dst(f)) } } + /* + * Second Step: invoke sphinx-build + */ val tagList = if (tags.isEmpty) "" else tags.mkString(" (", ", ", ")") val desc = "%s%s" format (builder, tagList) s.log.info("Building Sphinx %s documentation..." format desc) @@ -101,7 +110,7 @@ object Sphinx { s.log.info("Sphinx %s documentation created: %s" format (desc, target)) temp.descendentsExcept("*", "").get.toSet } - val toplevel = docs * ("*" - ".*" - "_sphinx" - "_build" - "disabled" - "target") + val toplevel = docs * ("*" - "disabled") val inputs = toplevel.descendentsExcept("*", "").get.toSet cached(inputs) target From a132bb5deba0895fe0051d8512c860b3d404423b Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 21 Sep 2012 16:09:52 +0200 Subject: [PATCH 5/9] make it work with Java 6 (aargh) --- project/Sphinx.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Sphinx.scala b/project/Sphinx.scala index 4a7dad2878..1bfeffc883 100644 --- a/project/Sphinx.scala +++ b/project/Sphinx.scala @@ -64,7 +64,7 @@ object Sphinx { val temp = docs.getParentFile / (docs.getName + "_" + builder) val cache = cacheDir / "sphinx" / builder val cached = FileFunction.cached(cache)(FilesInfo.hash, FilesInfo.exists) { (in, out) => - def dst(f: File) = temp.toPath.resolve(docs.toPath.relativize(f.toPath)).toFile + def dst(f: File) = new File(temp.toURI.resolve(docs.toURI.relativize(f.toURI))) def filter(f: File) = filterExt contains f.getName.reverse.takeWhile('.' !=).reverse val Replacer = """@(\w+)@""".r /* From 750f430bab5c432249e740aea208f19a561a464e Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 21 Sep 2012 16:22:57 +0200 Subject: [PATCH 6/9] Fixing so that the 0MQ tests will run on 0mq 3 and removed some boiler from RemoteClientLifeCycleEvent --- .../main/scala/akka/remote/RemoteTransport.scala | 13 +++++++------ .../akka/zeromq/ConcurrentSocketActorSpec.scala | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/RemoteTransport.scala b/akka-remote/src/main/scala/akka/remote/RemoteTransport.scala index 3aa3818de7..bfbb8529be 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteTransport.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteTransport.scala @@ -24,6 +24,7 @@ sealed trait RemoteLifeCycleEvent extends Serializable { */ trait RemoteClientLifeCycleEvent extends RemoteLifeCycleEvent { def remoteAddress: Address + final def getRemoteAddress: Address = remoteAddress } /** @@ -31,8 +32,8 @@ trait RemoteClientLifeCycleEvent extends RemoteLifeCycleEvent { */ case class RemoteClientError( @BeanProperty cause: Throwable, - @transient @BeanProperty remote: RemoteTransport, - @BeanProperty remoteAddress: Address) extends RemoteClientLifeCycleEvent { + @transient remote: RemoteTransport, + remoteAddress: Address) extends RemoteClientLifeCycleEvent { override def logLevel: Logging.LogLevel = Logging.ErrorLevel override def toString: String = "RemoteClientError@" + remoteAddress + ": Error[" + Logging.stackTraceFor(cause) + "]" } @@ -42,7 +43,7 @@ case class RemoteClientError( */ case class RemoteClientDisconnected( @transient @BeanProperty remote: RemoteTransport, - @BeanProperty remoteAddress: Address) extends RemoteClientLifeCycleEvent { + remoteAddress: Address) extends RemoteClientLifeCycleEvent { override def logLevel: Logging.LogLevel = Logging.DebugLevel override def toString: String = "RemoteClientDisconnected@" + remoteAddress } @@ -52,7 +53,7 @@ case class RemoteClientDisconnected( */ case class RemoteClientConnected( @transient @BeanProperty remote: RemoteTransport, - @BeanProperty remoteAddress: Address) extends RemoteClientLifeCycleEvent { + remoteAddress: Address) extends RemoteClientLifeCycleEvent { override def logLevel: Logging.LogLevel = Logging.DebugLevel override def toString: String = "RemoteClientConnected@" + remoteAddress } @@ -62,7 +63,7 @@ case class RemoteClientConnected( */ case class RemoteClientStarted( @transient @BeanProperty remote: RemoteTransport, - @BeanProperty remoteAddress: Address) extends RemoteClientLifeCycleEvent { + remoteAddress: Address) extends RemoteClientLifeCycleEvent { override def logLevel: Logging.LogLevel = Logging.InfoLevel override def toString: String = "RemoteClientStarted@" + remoteAddress } @@ -72,7 +73,7 @@ case class RemoteClientStarted( */ case class RemoteClientShutdown( @transient @BeanProperty remote: RemoteTransport, - @BeanProperty remoteAddress: Address) extends RemoteClientLifeCycleEvent { + remoteAddress: Address) extends RemoteClientLifeCycleEvent { override def logLevel: Logging.LogLevel = Logging.InfoLevel override def toString: String = "RemoteClientShutdown@" + remoteAddress } diff --git a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala index d5d9370a2f..3226b874a1 100644 --- a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala +++ b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala @@ -18,8 +18,8 @@ class ConcurrentSocketActorSpec extends AkkaSpec { def checkZeroMQInstallation = try { zmq.version match { - case ZeroMQVersion(2, 1, _) ⇒ Unit - case version ⇒ invalidZeroMQVersion(version) + case ZeroMQVersion(x, y, _) if x >= 3 || (x >= 2 && y >= 1) ⇒ Unit + case version ⇒ invalidZeroMQVersion(version) } } catch { case e: LinkageError ⇒ zeroMQNotInstalled From 3f200c9920c7a79602bffee9b1dcdcea6bf0cdc7 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 21 Sep 2012 16:23:55 +0200 Subject: [PATCH 7/9] Improvements based on feedback, see #2251 --- akka-docs/cluster/cluster-usage.rst | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/akka-docs/cluster/cluster-usage.rst b/akka-docs/cluster/cluster-usage.rst index 2848291a32..b123e24db4 100644 --- a/akka-docs/cluster/cluster-usage.rst +++ b/akka-docs/cluster/cluster-usage.rst @@ -219,19 +219,30 @@ The nodes in the cluster monitor each other by sending heartbeats to detect if a unreachable from the rest of the cluster. The heartbeat arrival times is interpreted by an implementation of `The Phi Accrual Failure Detector `_. -It calculates a *phi* value representing the likelihood that the node is down. + +The suspicion level of failure is given by a value called *phi*. +The basic idea of the phi failure detector is to express the value of *phi* on a scale that +is dynamically adjusted to reflect current network conditions. + +The value of *phi* is calculated as:: + + phi = -log10(1 - F(timeSinceLastHeartbeat) + +where F is the cumulative distribution function of a normal distribution with mean +and standard deviation estimated from historical heartbeat inter-arrival times. In the :ref:`cluster_configuration` you can adjust the ``akka.cluster.failure-detector.threshold`` -to define when a *phi* value is to be considered as a failure. -A low ``threshold`` is prone to generate many wrong suspicions but ensures +to define when a *phi* value is considered to be a failure. + +A low ``threshold`` is prone to generate many false positives but ensures a quick detection in the event of a real crash. Conversely, a high ``threshold`` generates fewer mistakes but needs more time to detect actual crashes. The default ``threshold`` is 8 and is appropriate for most situations. However in cloud environments, such as Amazon EC2, the value could be increased to 12 in order to account for network issues that sometimes occur on such platforms. -The following chart illustrates how *phi* increase with increasing time since previous -heartbeat. +The following chart illustrates how *phi* increase with increasing time since the +previous heartbeat. .. image:: images/phi1.png @@ -239,7 +250,7 @@ Phi is calculated from the mean and standard deviation of historical inter arrival times. The previous chart is an example for standard deviation of 200 ms. If the heartbeats arrive with less deviation the curve becomes steeper, i.e. it's possible to determine failure more quickly. The curve looks like this for -standard deviation of 100 ms. +a standard deviation of 100 ms. .. image:: images/phi2.png From 20c7b274cbd137d678ec06993672bf62d7f1afd8 Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 21 Sep 2012 16:33:28 +0200 Subject: [PATCH 8/9] now hopefully fix it for real (no guarantees, it just works here) --- project/Sphinx.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Sphinx.scala b/project/Sphinx.scala index 1bfeffc883..2f13710917 100644 --- a/project/Sphinx.scala +++ b/project/Sphinx.scala @@ -64,7 +64,7 @@ object Sphinx { val temp = docs.getParentFile / (docs.getName + "_" + builder) val cache = cacheDir / "sphinx" / builder val cached = FileFunction.cached(cache)(FilesInfo.hash, FilesInfo.exists) { (in, out) => - def dst(f: File) = new File(temp.toURI.resolve(docs.toURI.relativize(f.toURI))) + def dst(f: File) = temp / IO.relativize(docs, f).get def filter(f: File) = filterExt contains f.getName.reverse.takeWhile('.' !=).reverse val Replacer = """@(\w+)@""".r /* From f6f81d1fd0b4cadfb0441fcfadb1873eacda2a64 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 21 Sep 2012 16:40:17 +0200 Subject: [PATCH 9/9] Move phi images to new dir, see #2251 --- akka-docs/{ => rst}/cluster/images/phi1.png | Bin akka-docs/{ => rst}/cluster/images/phi2.png | Bin akka-docs/{ => rst}/cluster/images/phi3.png | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename akka-docs/{ => rst}/cluster/images/phi1.png (100%) rename akka-docs/{ => rst}/cluster/images/phi2.png (100%) rename akka-docs/{ => rst}/cluster/images/phi3.png (100%) diff --git a/akka-docs/cluster/images/phi1.png b/akka-docs/rst/cluster/images/phi1.png similarity index 100% rename from akka-docs/cluster/images/phi1.png rename to akka-docs/rst/cluster/images/phi1.png diff --git a/akka-docs/cluster/images/phi2.png b/akka-docs/rst/cluster/images/phi2.png similarity index 100% rename from akka-docs/cluster/images/phi2.png rename to akka-docs/rst/cluster/images/phi2.png diff --git a/akka-docs/cluster/images/phi3.png b/akka-docs/rst/cluster/images/phi3.png similarity index 100% rename from akka-docs/cluster/images/phi3.png rename to akka-docs/rst/cluster/images/phi3.png