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
> >
>
>

Reply via email to