| [[GuiceJMSExample-GuiceJMSExample]] |
| === Guice JMS Example |
| |
| *Available as of Camel 1.5 onwards* |
| |
| The Guice JMS example is functionally similar to both the |
| link:walk-through-an-example.adoc[first example] and the |
| link:spring-example.adoc[Spring Example] but using |
| link:guice.adoc[Guice] as the Dependency Injection framework. |
| |
| In this example we just write RouteBuilder implementations, then we |
| write a Guice module |
| https://github.com/apache/camel/blob/master/examples/camel-example-guice-jms/src/main/java/org/apache/camel/example/guice/jms/MyModule.java[MyModule] |
| to create the CamelContext, bind any RouteBuilder instances and |
| configure any components and endpoints, then we create a |
| https://github.com/apache/camel/blob/master/examples/camel-example-guice-jms/src/main/resources/guicejndi.properties[guicejndi.properties] |
| file to bootstrap Guice and Camel. |
| |
| To run the example we currently use the maven exec plugin. For example |
| from the source or binary distribution the following should work |
| |
| [source,java] |
| ---- |
| cd examples/camel-example-guice-jms |
| mvn compile exec:java |
| ---- |
| |
| What this does is boot up the Guice based JNDI provider from |
| https://github.com/apache/camel/blob/master/examples/camel-example-guice-jms/src/main/resources/guicejndi.properties[guicejndi.properties] |
| file on the classpath. This then bootstraps the Guice injector and loads |
| whatever Guice modules are defined in the guicejndi.properties file -- |
| then injects the remaining properties in the file. |
| |
| |
| [[GuiceJMSExample-ConfiguringComponents]] |
| ==== Configuring Components |
| |
| If you see the `jms()` method of the Guice |
| https://github.com/apache/camel/blob/master/examples/camel-example-guice-jms/src/main/java/org/apache/camel/example/guice/jms/MyModule.java[MyModule] |
| you will see it is annotated with `@Provides` to indicate to Guice that |
| it is a provider and it is annotated with `@JndiBind("jms")` to bind it |
| to the JNDI name `jms` when it is created. |
| |
| This method then configures the component. The provider method is |
| parameterized by the `@Named("activemq.brokerURL")` property which is |
| injected from the |
| https://github.com/apache/camel/blob/master/examples/camel-example-guice-jms/src/main/resources/guicejndi.properties[guicejndi.properties] |
| file. This lets you define the properties which should be environment |
| specific (such as URLs, machine names, usernames/passwords and so forth) |
| while leaving all of the other configuration which does not change in |
| different environments in Java code. |
| |
| So you can use link:guice.adoc[Guice] to dependency inject whatever |
| objects you need to create, be it an link:endpoint.adoc[Endpoint], |
| link:component.adoc[Component], link:route-builder.adoc[RouteBuilder] or |
| arbitrary link:bean-integration.adoc[bean used within a route]. Then you |
| can inject any properties from the jndi.properties file easily -- so that |
| most of your configuration is all in Java code which is typesafe and |
| easily refactorable - then leaving some properties to be environment |
| specific (the guicejndi.properties file) which you can then change based |
| on development, testing, production, etc. |