Using blueprint as the Apache Camel DSL to describe routes in IBM Liberty - apache-camel

My goal is to get Camel running under IBM Liberty application server using OSGi and be able to describe the DSL (Domain Specific Language) routes in Blueprint. I am making progress and now have a Liberty environment with Camel installed and configured as OSGi bundles. When I write a Java DSL Camel app as an OSGi bundle, all works exactly as I might hope.
My last step is to be able to describe my camel routes in Blueprint. To that end I create a new OSGi bundle and defined a blueprint.xml that looks as follows:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camelBlueprint="http://camel.apache.org/schema/blueprint"
xsi:schemaLocation="http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint-2.14.1.xsd">
<camelBlueprint:camelContext>
<camelBlueprint:route>
<camelBlueprint:from uri="file:c:/temp/in"/>
<camelBlueprint:to uri="file:c:/temp/out"/>
</camelBlueprint:route>
</camelBlueprint:camelContext>
</blueprint>
When I attempt to deploy this OSGi bundle, the IBM Liberty OSGi framework fails to deploy the application with the following errors:
[3/2/15 0:42:38:796 CST] 00000035 com.ibm.ws.app.manager.esa.internal.DeploySubsystemAction
A CWWKZ0403E: A management exception was generated when trying to install the application Camel1 into an OSGi framework. The error text from the OSGi framework is:
Resource does not exist: org.apache.aries.subsystem.core.archive.SubsystemContentRequirement:
namespace=osgi.identity, attributes={}, directives={filter=(&(osgi.identity=OSGITest1)(type=osgi.bundle)(version>=1.0.0))}, resource=org.apache.aries.subsystem.core.internal.SubsystemResource#7bc2d3bc
Unfortunately this is where I am now stumped and stuck. I believe that IBM Liberty uses Equinox as the OSGi platform and not Karaf but reading the Camel Blueprint docs I seem to understand that Apache Aries is required (which Liberty supplies and uses) and that Karaf isn't a dependency.
My MANIFEST.MF for my test bundle is:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: OSGITest1
Bundle-SymbolicName: OSGITest1
Bundle-Version: 1.0.0.qualifier
Bundle-Blueprint: OSGI-INF/blueprint/*.xml
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: kolban.osgitest
Import-Package: org.apache.camel;version="2.14.1",
org.apache.camel.blueprint;version="2.14.1"

this message can occur if the resolver can't see the bundle, or there's something wrong with the bundle (typically with the Blueprint). If the bundle resolves ok when you remove the blueprint, then you need to look at what might be wrong in the blueprint. If this is the case, I would suspect you don't have the Camel blueprint namespace handler enabled in the runtime.
I hope this helps.
Regards, Graham.

Related

Cannot find the right camel-cxf dependencies for v3.18.0, e.g. CxfHeaderFilterStrategy, CxfOperationException

My application has been using
org.apache.camel.component.cxf.common.header.CxfHeaderFilterStrategy
org.apache.camel.spi.HeaderFilterStrategy.Direction
org.apache.camel.component.cxf.CxfOperationException
defined by camel-cxf. But my build fails when using Camel 3.18.0. What dependencies changes do I need for these classes in 3.18.0?
Copying from the Camel 3.18 upgrade guide:
https://camel.apache.org/manual/camel-3x-upgrade-guide-3_18.html#_camel_cxf
The camel-cxf JAR has been split up into SOAP vs REST and Spring and non Spring JARs.
camel-cxf-soap
camel-cxf-spring-soap
camel-cxf-rest
camel-cxf-spring-rest
camel-cxf-transport
camel-cxf-spring-transport
When using Spring Boot then you need to migrate from camel-cxf-starter to use SOAP or REST:
camel-cxf-soap-starter
camel-cxf-rest-starter

Karaf v4.0.8 : Multiple Blueprints cannot load configuration from same persistent-id

Update: It took a little time to realize for some reason but I see that configuration files are bundle PID specific and by trying to load the same cfg file in blueprint within two different bundles, I was creating a race condition. Make sure you use the cfg files in their target bundles only.
Note: The above applies only to blueprint bundles. If you do not depend on OSGI ConfigAdmin service to keep the bundles dynamically and want to use the cfg files from something like a Camel context, that should be fine.
I have 2 blueprints deployed through karaf 4.0.8 'deploy' folder. Both have the following common section:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint https://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cm:property-placeholder id="common" persistent-id="common" update-strategy="reload" placeholder-prefix="$(" placeholder-suffix=")"/>
<cm:property-placeholder id="sqlcfg" persistent-id="12345" update-strategy="reload" placeholder-prefix="$[" placeholder-suffix="]">
</cm:property-placeholder>
I would like to load configuration common to both from 'common'. However, when they share the same persistentId and properties file from the 'etc' folder, the blueprint to be deployed second keeps loading and unloading.
If I get them to load from different files - it all works.
Any ideas from the community why I have this behaviour?
Thanks in advance.
In my experience, you either set a different persistent-id or set update-strategy="none". This will stop the second module from going into that loading/unloading loop.
The downside is that you lose the auto refresh of the config file.

Apache Camel reference property files with and without OSGI

I understand that if you deploy your Camel project to an OSGI environment like Karaf you can simply write:
<cm:property-placeholder id="INT001_********_Properties" persistent-id="INT001_SelfServiceMachine" />
<camelContext xmlns="http://camel.apache.org/schema/blueprint"
id="INT001_SelfServiceMachine" useMDCLogging="true">
<propertyPlaceholder id="properties" location="blueprint:INT001_*********_Properties"/>
And this works when the project is deployed to Karaf and the property file is located there in the etc folder.
But how can you configure it when Karaf is not available?
I used this bean before:
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location" value="classpath:some.properties"
/> </bean>
But is there a single way to refer to property files regardless of when you are in Karaf or when you are in your e.g. Eclipse environment and your property file is in your /src/resources folder and the bean above works? For instance, when you use Jenkins and and want to run tests and build the bundle, you may not have Karaf available.
Thanks for any input on this.
You can maybe implement your own PropertiesResolver which know how to resolve your properties according to the runtime environment. If OSGi is detected, then it can use ConfigurationAdmin, else it can use a static properties file.
Personally, I use something more simple thanks to Spring DM: my beans/configurations are dispatched in multiples files, and all the configuration related to OSGi is regrouped in one file. In Karaf, Spring DM load all XML in META-INF/spring. Outside of Karaf, I filter the XML to exclude the OSGi configuration.
There is a blueprint noosgi bundle around, that one can be used to have the blueprint capabilities outside of the osgi container. With this you're able to stick to your blueprint xml, though you need to change from configuration admin service for property lookup to native blueprint property replacement.

Call remote ejb from camel route

I'd like to create osgi bundle which listen for soap messages and route them to remote ejb. I have servicemix 4.x as a bundle environment, glassfish 4 as a ejb container and camel as routing engine. Is it possible to connect to each other?
Yes, there cxf and ejb components and you should be able to define your route like this:
from("cxf:...")
// ...
.to(ejb:...")
;
Please refer to: Apache Camel Components - CXF and EJB.

how to create and export camelProxy with apache camel blueprint

I am using camel-blueprint with aries blueprint in osgi container. My configuration is as follows
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://camel.apache.org/schema/blueprint">
<c:camelContext>
<c:proxy id="myProxySender" serviceInterface="com.cmt.gabs.camel.test.MyInterface" serviceUrl="direct:a" />
<c:route>
<c:from uri="direct:a" />
<c:transform>
<c:simple>Hello ${body}</c:simple>
</c:transform>
<c:to uri="log:org.apache.camel.example?level=ERROR" />
</c:route>
</c:camelContext>
When i start the bundle it does not give any error, but the proxy is also not created as a service. Please tell me if i am doing any wrong.
I Want to use Camel Proxy for endpoint direct:a
edit
Camel version 2.11
OSGI container equinox 3.8
I had found the answer long ago but forgot to respond to it.
The answer is simple i just had to export it as a service.

Resources