| [[Kura-EclipseKuracomponent]] |
| = Eclipse Kura component (deprecated) |
| :page-source: components/camel-kura/src/main/docs/kura.adoc |
| |
| *Since Camel 2.15* |
| |
| This documentation page covers the integration options of Camel with the |
| https://eclipse.org/kura/[Eclipse Kura] M2M gateway. The common reason |
| to deploy Camel routes into the Eclipse Kura is to provide enterprise |
| integration patterns and Camel components to the messaging M2M gateway. |
| For example you might want to install Kura on Raspberry PI, then read |
| temperature from the sensor attached to that Raspberry PI using Kura |
| services and finally forward the current temperature value to your data |
| center service using Camel EIP and components. |
| |
| [[Kura-KuraRouteractivator]] |
| == KuraRouter activator |
| |
| Bundles deployed to the Eclipse Kura are usually |
| http://eclipse.github.io/kura/doc/hello-example.html#create-java-class[developed |
| as bundle activators]. So the easiest way to deploy Apache Camel routes |
| into the Kura is to create an OSGi bundle containing the class extending |
| `org.apache.camel.kura.KuraRouter` class: |
| |
| [source,java] |
| ------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| from("timer:trigger"). |
| to("netty-http:http://app.mydatacenter.com/api"); |
| } |
| |
| } |
| ------------------------------------------------------- |
| |
| Keep in mind that `KuraRouter` implements |
| the `org.osgi.framework.BundleActivator` interface, so you need to |
| register its `start` and `stop` lifecycle methods |
| while http://eclipse.github.io/kura/doc/hello-example.html#create-component-class[creating |
| Kura bundle component class]. |
| |
| Kura router starts its own OSGi-aware `CamelContext`. It means that for |
| every class extending `KuraRouter`, there will be a dedicated |
| `CamelContext` instance. Ideally we recommend to deploy one `KuraRouter` |
| per OSGi bundle. |
| |
| [[Kura-DeployingKuraRouter]] |
| === Deploying KuraRouter |
| |
| Bundle containing your Kura router class should import the following |
| packages in the OSGi manifest: |
| |
| [source,xml] |
| -------------------------------------------------------------------------------------------------------------------- |
| Import-Package: org.osgi.framework;version="1.3.0", |
| org.slf4j;version="1.6.4", |
| org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apache.camel.model, |
| org.apache.camel.component.kura |
| -------------------------------------------------------------------------------------------------------------------- |
| |
| Keep in mind that you don't have to import every Camel component bundle |
| you plan to use in your routes, as Camel components are resolved as the |
| services on the runtime level. |
| |
| Before you deploy your router bundle, be sure that you have deployed |
| (and started) the following Camel core bundles (using Kura GoGo |
| shell)... |
| |
| [source,xml] |
| ----------------------------------------------------------------------------------------------------------- |
| install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar |
| start <camel-core-bundle-id> |
| install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-2.15.0.jar |
| start <camel-core-osgi-bundle-id> |
| install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar |
| start <camel-kura-bundle-id> |
| ----------------------------------------------------------------------------------------------------------- |
| |
| ...and all the components you plan to use in your routes: |
| |
| [source,xml] |
| ----------------------------------------------------------------------------------------------------- |
| install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-2.15.0.jar |
| start <camel-stream-bundle-id> |
| ----------------------------------------------------------------------------------------------------- |
| |
| Then finally deploy your router bundle: |
| |
| [source,xml] |
| ---------------------------------------------------------------------------------- |
| install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar |
| start <your-bundle-id> |
| ---------------------------------------------------------------------------------- |
| |
| [[Kura-KuraRouterutilities]] |
| === KuraRouter utilities |
| |
| Kura router base class provides many useful utilities. This section |
| explores each of them. |
| |
| [[Kura-SLF4Jlogger]] |
| ==== SLF4J logger |
| |
| Kura uses SLF4J facade for logging purposes. Protected member `log` |
| returns SLF4J logger instance associated with the given Kura router. |
| |
| [source,java] |
| ---------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| log.info("Configuring Camel routes!"); |
| ... |
| } |
| |
| } |
| ---------------------------------------------- |
| |
| [[Kura-BundleContext]] |
| ==== BundleContext |
| |
| Protected member `bundleContext` returns bundle context associated with |
| the given Kura router. |
| |
| [source,java] |
| --------------------------------------------------------------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| ServiceReference<MyService> serviceRef = bundleContext.getServiceReference(LogService.class.getName()); |
| MyService myService = bundleContext.getService(serviceRef); |
| ... |
| } |
| |
| } |
| --------------------------------------------------------------------------------------------------------------- |
| |
| [[Kura-CamelContext]] |
| ==== CamelContext |
| |
| Protected member `camelContext` is the `CamelContext` associated with |
| the given Kura router. |
| |
| [source,java] |
| ---------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| camelContext.getStatus(); |
| ... |
| } |
| |
| } |
| ---------------------------------------------- |
| |
| [[Kura-ProducerTemplate]] |
| ==== ProducerTemplate |
| |
| Protected member `producerTemplate` is the `ProducerTemplate` instance |
| associated with the given Camel context. |
| |
| [source,java] |
| ----------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| producerTemplate.sendBody("jms:temperature", 22.0); |
| ... |
| } |
| |
| } |
| ----------------------------------------------------------- |
| |
| [[Kura-ConsumerTemplate]] |
| ==== ConsumerTemplate |
| |
| Protected member `consumerTemplate` is the `ConsumerTemplate` instance |
| associated with the given Camel context. |
| |
| [source,java] |
| -------------------------------------------------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| double currentTemperature = producerTemplate.receiveBody("jms:temperature", Double.class); |
| ... |
| } |
| |
| } |
| -------------------------------------------------------------------------------------------------- |
| |
| [[Kura-OSGiserviceresolver]] |
| ==== OSGi service resolver |
| |
| OSGi service resolver (`service(Class<T> serviceType)`) can be used to |
| easily retrieve service by type from the OSGi bundle context. |
| |
| [source,java] |
| ------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| MyService myService = service(MyService.class); |
| ... |
| } |
| |
| } |
| ------------------------------------------------------- |
| |
| If service is not found, a `null` value is returned. If you want your |
| application to fail if the service is not available, use |
| `requiredService(Class)` method instead. The `requiredService` throws |
| `IllegalStateException` if a service cannot be found. |
| |
| [source,java] |
| --------------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| @Override |
| public void configure() throws Exception { |
| MyService myService = requiredService(MyService.class); |
| ... |
| } |
| |
| } |
| --------------------------------------------------------------- |
| |
| [[Kura-KuraRouteractivatorcallbacks]] |
| === KuraRouter activator callbacks |
| |
| Kura router comes with the lifecycle callbacks that can be used to |
| customize the way the Camel router works. For example to configure the |
| `CamelContext` instance associated with the router just before the |
| former is started, override `beforeStart` method of the `KuraRouter` |
| class: |
| |
| [source,java] |
| -------------------------------------------------------------------------- |
| public class MyKuraRouter extends KuraRouter { |
| |
| ... |
| |
| protected void beforeStart(CamelContext camelContext) { |
| OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext; |
| osgiContext.setName("NameOfTheRouter"); |
| } |
| |
| } |
| -------------------------------------------------------------------------- |
| |
| [[Kura-LoadingXMLroutesfromConfigurationAdmin]] |
| === Loading XML routes from ConfigurationAdmin |
| |
| Sometimes it is desired to read the XML definition of the routes from |
| the server configuration. This a common scenario for IoT gateways where |
| over-the-air redeployment cost may be significant. To address this |
| requirement each `KuraRouter` looks for the |
| `kura.camel.BUNDLE-SYMBOLIC-NAME.route` property from the `kura.camel` |
| PID using the OSGi ConfigurationAdmin. This approach allows you to |
| define Camel XML routes file per deployed `KuraRouter`. In order to |
| update a route, just edit an appropriate configuration property and |
| restart a bundle associated with it. The content of |
| the `kura.camel.BUNDLE-SYMBOLIC-NAME.route` property is expected to be |
| Camel XML route file, for example: |
| |
| [source,java] |
| ------------------------------------------------------ |
| <routes xmlns="http://camel.apache.org/schema/spring"> |
| <route id="loaded"> |
| <from uri="direct:bar"/> |
| <to uri="mock:bar"/> |
| </route> |
| </routes> |
| ------------------------------------------------------ |
| |
| |
| |
| [[Kura-DeployingKurarouterasadeclarativeOSGiservice]] |
| === Deploying Kura router as a declarative OSGi service |
| |
| If you would like to deploy your Kura router as a declarative OSGi |
| service, you can use `activate` and `deactivate` methods provided by |
| `KuraRouter`. |
| |
| [source,java] |
| ---------------------------------------------------------------------------------------------------------------------------------------------- |
| <scr:component name="org.eclipse.kura.example.camel.MyKuraRouter" activate="activate" deactivate="deactivate" enabled="true" immediate="true"> |
| <implementation class="org.eclipse.kura.example.camel.MyKuraRouter"/> |
| </scr:component> |
| ---------------------------------------------------------------------------------------------------------------------------------------------- |
| |