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>


Reply via email to