https://issues.apache.org/jira/browse/CAMEL-9562
I've opened an issue. I think it is a relatively easy thing to add a strict mode flag without breaking anyone. You're right that it is easy enough to make it work right. But if I haven't set something up to work correctly I don't want the classloader fixing it inadvertently. I haven't run into this before since for the past two years I've used Camel blueprint XML exclusively and only used Java for a beans and service calls. I was venturing into using route builders when I ran into this. On Tue, Feb 2, 2016 at 10:40 AM, Quinn Stevenson < qu...@pronoia-solutions.com> 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 > > > >