There is a much simpler way to use an OSGi service with blueprint.
Simply use the bean component of camel. It resolves beans against the
camel registry.
When you define your camel context using blueprint then the camel
registry automatically includes all blueprint beans.
So you can do this in java dsl:
to("bean:echo-service")
It will find the bean with this id in blueprint. In your case it will be
the service reference.
Christian
On 26.01.2016 23:11, Quinn Stevenson wrote:
When I use an OSGi Service registered using Blueprint from a Java route (built
using a Java RouteBuilder), the Camel route isn’t detecting the when the
service is not available, and it isn’t updating when the service implementation
changes.
The simple setup I’m using has a Java interface for the OSGi service in one
bundle, and implementation of that interface which uses Blueprint to register
the service in another bundle, and simple RouteBuilder that uses the service in
a third bundle. The implementation of the service is injected into the
RouteBuilder using Blueprint, and the Camel context is configured in Blueprint
in a fourth bundle.
After all these bundles are installed and started in Karaf, the run and the
hashCode of service is logged every time the Camel timer fires and triggers an
exchange. If I stop the bundle that registers the service using Blueprint, the
route continues to log the same hashCode when it calls the OSGi service. I
would expect a ServiceUnavailableException after a timeout.
Additionally, when I restart the bundle that registers the service object, I
continue to get the same hashCode. I would expect to get a new hashCode value.
Am I doing something wrong? Do I need to do something different do get the
dynamic behavior I’m looking for?
The code looks like this:
Java Interface (service-interface bundle):
public interface Echo {
String execute(String body);
}
Java Implementation:
public class EchoServiceOne implements Echo {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public String execute(String body) {
log.info( "{}:{} -> execute", this.getClass().getSimpleName(),
this.hashCode() );
return body;
}
}
Blueprint Registering the service (service-one bundle):
<?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"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<service interface="com.pronoia.test.osgi.service.Echo" >
<service-properties>
<entry key="instance" value="one" />
</service-properties>
<bean class="com.pronoia.test.osgi.service.impl.EchoServiceOne" />
</service>
</blueprint>
Java RouteBuilder (route-builder bundle):
public class VerySimpleBuilder extends RouteBuilder {
Echo blueprintServiceReference;
@Override
public void configure() throws Exception {
from("timer://very-simple-builder?period=5000").routeId(
"very-simple-route" )
.setBody( simple( "${exchangeProperty[" + Exchange.TIMER_FIRED_TIME +
"]}") )
.log("Calling Service via Reference: ${body}" )
.bean(blueprintServiceReference,false)
.to( "mock://result")
.log("Finished" );
}
public Echo getBlueprintServiceReference() {
return blueprintServiceReference;
}
public void setBlueprintServiceReference(Echo blueprintServiceReference) {
this.blueprintServiceReference = blueprintServiceReference;
}
}
Blueprint constructing the Camel context (camel-context bundle):
<?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:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
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
http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"
<reference id="echo-service" interface="com.pronoia.test.osgi.service.Echo"
filter="instance=one" timeout="2000" />
<bean id="very-simple-route-builder"
class="com.pronoia.test.camel.builder.VerySimpleBuilder">
<property name="blueprintServiceReference" ref="echo-service" />
</bean>
<camelContext id="very-simple-context"
xmlns="http://camel.apache.org/schema/blueprint">
<routeBuilder ref="very-simple-route-builder" />
</camelContext>
</blueprint>
--
Christian Schneider
http://www.liquid-reality.de
Open Source Architect
http://www.talend.com