diff --git a/akka-docs/scala/camel.rst b/akka-docs/scala/camel.rst index b3fc5e5f2a..9c24d123f0 100644 --- a/akka-docs/scala/camel.rst +++ b/akka-docs/scala/camel.rst @@ -5,6 +5,8 @@ Camel ####### +Additional Resources +==================== For an introduction to akka-camel 2, see also the Peter Gabryanczyk's talk `Migrating akka-camel module to Akka 2.x`_. For an introduction to akka-camel 1, see also the `Appendix E - Akka and Camel`_ @@ -32,7 +34,9 @@ actor API, actors can now exchange messages with other systems over large number of protocols and APIs such as HTTP, SOAP, TCP, FTP, SMTP or JMS, to mention a few. At the moment, approximately 80 protocols and APIs are supported. -The akka-camel module is based on `Apache Camel`_, a powerful and leight-weight +Apache Camel +------------ +The akka-camel module is based on `Apache Camel`_, a powerful and light-weight integration framework for the JVM. For an introduction to Apache Camel you may want to read this `Apache Camel article`_. Camel comes with a large number of `components`_ that provide bindings to different protocols and @@ -43,6 +47,8 @@ APIs. The `camel-extra`_ project provides further components. .. _components: http://camel.apache.org/components.html .. _camel-extra: http://code.google.com/p/camel-extra/ +Consumer +-------- Usage of Camel's integration components in Akka is essentially a one-liner. Here's an example. @@ -60,16 +66,20 @@ component`_), only the actor's endpointUri method must be changed. .. includecode:: code/akka/docs/camel/Introduction.scala#Consumer +Producer +-------- Actors can also trigger message exchanges with external systems i.e. produce to Camel endpoints. .. includecode:: code/akka/docs/camel/Introduction.scala :include: imports,Producer -In the above example, any message sent to this actor will be added (produced) to -the example JMS queue. Producer actors may choose from the same set of Camel +In the above example, any message sent to this actor will be sent to +the JMS queue ``orders``. Producer actors may choose from the same set of Camel components as Consumer actors do. +CamelMessage +------------ The number of Camel components is constantly increasing. The akka-camel module can support these in a plug-and-play manner. Just add them to your application's classpath, define a component-specific endpoint URI and use it to exchange @@ -83,3 +93,66 @@ representations which are used by Consumer and Producer actors for pattern matching, transformation, serialization or storage. __ https://svn.apache.org/repos/asf/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java + + +Dependencies +============ + +SBT +--- +.. code-block:: scala + + "com.typesafe.akka" % "akka-camel" % "2.1-SNAPSHOT" + +Maven +----- +.. code-block:: xml + + + com.typesafe.akka + akka-camel + 2.1-SNAPSHOT + + +.. _camel-consumer-actors: + + +Consumer Actors +================ + +For objects to receive messages, they must mixin the `Consumer`_ +trait. For example, the following actor class (Consumer1) implements the +endpointUri method, which is declared in the Consumer trait, in order to receive +messages from the ``file:data/input/actor`` Camel endpoint. + +.. _Consumer: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/Consumer.scala + +.. includecode:: code/akka/docs/camel/Consumers.scala#Consumer1 + +Whenever a file is put into the data/input/actor directory, its content is +picked up by the Camel `file component`_ and sent as message to the +actor. Messages consumed by actors from Camel endpoints are of type +`CamelMessage`_. These are immutable representations of Camel messages. + +.. _file component: http://camel.apache.org/file2.html +.. _Message: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala + + +Here's another example that sets the endpointUri to +``jetty:http://localhost:8877/camel/default``. It causes Camel's `Jetty +component`_ to start an embedded `Jetty`_ server, accepting HTTP connections +from localhost on port 8877. + +.. _Jetty component: http://camel.apache.org/jetty.html +.. _Jetty: http://www.eclipse.org/jetty/ + +.. includecode:: code/akka/docs/camel/Consumers.scala#Consumer2 + +After starting the actor, clients can send messages to that actor by POSTing to +``http://localhost:8877/camel/default``. The actor sends a response by using the +self.reply method (Scala). For returning a message body and headers to the HTTP +client the response type should be `Message`_. For any other response type, a +new Message object is created by akka-camel with the actor response as message +body. + +.. _Message: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala diff --git a/akka-docs/scala/code/akka/docs/camel/Consumers.scala b/akka-docs/scala/code/akka/docs/camel/Consumers.scala new file mode 100644 index 0000000000..87b13aa601 --- /dev/null +++ b/akka-docs/scala/code/akka/docs/camel/Consumers.scala @@ -0,0 +1,30 @@ +package akka.docs.camel + +object Consumers { + { + //#Consumer1 + import akka.camel.{CamelMessage, Consumer} + + class Consumer1 extends Consumer { + def endpointUri = "file:data/input/actor" + + def receive = { + case msg: CamelMessage => println("received %s" format msg.bodyAs[String]) + } + } + //#Consumer1 + } + { + //#Consumer2 + import akka.camel.{CamelMessage, Consumer} + + class Consumer2 extends Consumer { + def endpointUri = "jetty:http://localhost:8877/camel/default" + + def receive = { + case msg: CamelMessage => sender ! ("Hello %s" format msg.bodyAs[String]) + } + } + //#Consumer2 + } +} \ No newline at end of file diff --git a/akka-docs/scala/code/akka/docs/camel/Introduction.scala b/akka-docs/scala/code/akka/docs/camel/Introduction.scala index 38546c9f41..4899843a27 100644 --- a/akka-docs/scala/code/akka/docs/camel/Introduction.scala +++ b/akka-docs/scala/code/akka/docs/camel/Introduction.scala @@ -1,11 +1,11 @@ package akka.docs.camel -object wrapper { +object Introduction { { //#Consumer-mina import akka.camel.{ CamelMessage, Consumer } - class MyActor extends Consumer { + class MinaClient extends Consumer { def endpointUri = "mina:tcp://localhost:6200?textline=true" def receive = { @@ -18,14 +18,14 @@ object wrapper { import akka.actor.{ ActorSystem, Props } val sys = ActorSystem("camel") - val myActor = sys.actorOf(Props[MyActor]) + val mina = sys.actorOf(Props[MinaClient]) //#Consumer-mina } { //#Consumer import akka.camel.{ CamelMessage, Consumer } - class MyActor extends Consumer { + class JettyAdapter extends Consumer { def endpointUri = "jetty:http://localhost:8877/example" def receive = { @@ -39,10 +39,16 @@ object wrapper { //#Producer import akka.actor.Actor import akka.camel.{ Producer, Oneway } + import akka.actor.{ ActorSystem, Props } - class MyActor extends Actor with Producer with Oneway { - def endpointUri = "jms:queue:example" + class Orders extends Actor with Producer with Oneway { + def endpointUri = "jms:queue:Orders" } + + val sys = ActorSystem("camel") + val orders = sys.actorOf(Props[Orders]) + + orders ! //#Producer } } \ No newline at end of file