Thank You Christian - 

Yes - I pointed out that if I used the Bean Component, everything seemed to 
work as I expected.

The problem I have is I use beans in filter blocks as well, and there I can’t 
use the 'to( “bean://<name” )’ construct.  I need to keep the original message 
bodies and just filter, and when I use the method(…) invocation, it’s hit or 
miss if it honors dynamic services (i.e. picks-up new instances when the 
implementation is replaced).  It’s very sensitive to how the bean with the 
service reference is declared.

I also tried using enrich( “bean://<bean-name>” ) with an aggregation strategy 
to get around this, but it worked the same way as the method( … ) DSL - it 
didn’t pickup new service instances when the services were replaced.



> On Feb 2, 2016, at 2:24 AM, Christian Schneider <ch...@die-schneider.net> 
> wrote:
> 
> 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
> 

Reply via email to