...
Info |
---|
For the purposes of the tutorial a single Maven project will be used for both the client and server. Ideally you would break your application down into the appropriate components. |
Code Block |
---|
mvn archetype:creategenerate -DgroupId=org.example -DartifactId=CamelWithJmsAndSpring |
...
First we need to have dependencies for the core Camel jars, its spring, jms components and finally ActiveMQ as the message broker.
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/pom.xml} |
Wiki Markup |
---|
{snippet:id=e2|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/pom.xml} |
Writing the Server
Create the Spring Service
For this example the Spring service (= our business service) on the server will be a simple multiplier which trebles in the received value.
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/server/Multiplier.java} |
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/server/Treble.java} |
Define the Camel Routes
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/server/ServerRoutes.java} |
...
The Spring config file is placed under META-INF/spring
as this is the default location used by the Camel Maven Plugin, which we will later use to run our server.
First we need to do the standard scheme declarations in the top. In the camel-server.xml we are using spring beans as the default bean: namespace and springs context:. For configuring ActiveMQ we use broker: and for Camel we of course have camel:. Notice that we don't use version numbers for the camel-spring schema. At runtime the schema is resolved in the Camel bundle. If we use a specific version number such as 1.4 then its IDE friendly as it would be able to import it and provide smart completion etc. See Xml Reference for further details.
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/META-INF/spring/camel-server.xml} |
Wiki Markup |
---|
{snippet:id=e2|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/META-INF/spring/camel-server.xml} |
Notice that we also have enabled the JMXAgent so we will be able to introspect the Camel Server with a JMX Console.
Wiki Markup |
---|
{snippet:id=e3|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/META-INF/spring/camel-server.xml} |
Wiki Markup |
---|
{snippet:id=e4|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/META-INF/spring/camel-server.xml} |
Wiki Markup |
---|
{snippet:id=e5|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/META-INF/spring/camel-server.xml} |
from="jmsbroker:queue:numbers).to("multiplier");
We use the vm protocol to connect to the ActiveMQ server as its embedded in this application.
...
We will initially create a client by directly using ProducerTemplate
. We will later create a client which uses Spring remoting to hide the fact that messaging is being used.
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/camel-client.xml} |
Wiki Markup |
---|
{snippet:id=e2|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/camel-client.xml} |
Wiki Markup |
---|
{snippet:id=e3|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/camel-client.xml} |
...
And the CamelClient source code:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/client/CamelClient.java} |
ProducerTemplate
is retrieved from a Spring ApplicationContext
and used to manually place a message on the "numbers" JMS queue. The requestBody
method will use the exchange pattern InOut, which states that the call should be synchronous, and that the caller expects a response....
Spring Remoting "eases the development of remote-enabled services". It does this by allowing you to invoke remote services through your regular Java interface, masking that a remote service is being called.
Wiki Markup |
---|
{snippet:id=e1|lang=xml|url=camel/trunk/examples/camel-example-spring-jms/src/main/resources/camel-client-remoting.xml} |
...
And the Java client source code:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/client/CamelClientRemoting.java} |
...
Okay enough talk, show me the code!
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/examples/camel-example-spring-jms/src/main/java/org/apache/camel/example/client/CamelClientEndpoint.java} |
"mina:tcp://localhost:61610"
then its just a matter of getting hold of this endpoint instead of the JMS and all the rest of the java code is exactly the same....