Christian -

I don’t know about a class loader issue, but I do know when I run the route 
configured as you have it below, I’m not getting a proxy to the service.  I 
know this because if I stop the bundle containing the OSGi service, the Camel 
context keeps running - I don’t get a ServiceUnavailableException after the 
timeout.  In fact, it keeps using whatever is injected into the RouteBuilder. 

I think that’s where the class loader thing came from - it appear to be using 
the implementation of the service directly - not via a Blueprint proxy.


> On Feb 2, 2016, at 1:37 PM, Christian Schneider <ch...@die-schneider.net> 
> wrote:
> 
> I am actually not sure if you have a classloader problem here.
> 
> In your original route you use:
> 
> .bean(blueprintServiceReference,false)
> 
> public void setBlueprintServiceReference(Echo blueprintServiceReference) {
>        this.blueprintServiceReference = blueprintServiceReference;
> }
> 
> This will simply call the service proxy that was injected by blueprint when 
> the route starts.
> This should pick up changing services according to the rules of blueprint. So 
> I don't think the Camel registry is involved at all in this case. It would
> only be involved when refering to the service via its interface name.
> 
> The routebuilder is found by a ref too. So I doubt the class loader is 
> involved there.
> 
> Christian
> 
> On 02.02.2016 17:40, Quinn Stevenson wrote:
>> 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
>>> 
> 
> 
> -- 
> Christian Schneider
> http://www.liquid-reality.de
> 
> Open Source Architect
> http://www.talend.com
> 

Reply via email to