Hi all,

I am currently working on a Camel project inside Fuse ESB but also saw this
problem inside the latest Servicemix release.

When using an OSGi service as processor inside a route and I try to
uninstall the project the route that uses the processor gets not shut down
because it calls the toString() method of the OSGi service which is already
uninstalled.

I don't know if it is a real bug but wanted to share my experience. A simple
workaround can also be seen at the end of the post.

The setup:

Following bundles are involved:
- Service-API-Bundle
- Service-Implementation-Bundle
- Camel-Route-Bundle

The route looks like:
---------------------------------------------
<?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:camel="http://camel.apache.org/schema/blueprint";
           xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs";
xmlns:cxf="http://cxf.apache.org/blueprint/core";
           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
       http://cxf.apache.org/blueprint/jaxrs
http://cxf.apache.org/schemas/blueprint/jaxrs.xsd
       http://cxf.apache.org/blueprint/core
http://cxf.apache.org/schemas/blueprint/core.xsd";>

    
    <reference id="osgiService" interface="sample.Service"/>

    <camelContext id="camelContext"
                  xmlns="http://camel.apache.org/schema/blueprint";>

      <route id="route">
        <from uri="direct-vm:start"/>

        
        <process ref="bean:osgiService"/>

    </camelContext>

</blueprint>
---------------------------------------------

Now if uninstalling all bundles or updating the "Service-Bundles" it happens
that the route does not shut down as it tries invoke the toString() method
of the OSGi service.

The invocation of the toString() method originates from
org.apache.camel.impl.RouteService.doStop() where the LifecycleStrategys
onRoutesremove() method is invoked which in turn calls the
getManagedObjectForRoute() method of the DefaultManagementObjectStrategy
class. Now this class creates a new ManagedRoute which invokes the
toString() method of the route.

The following stack trace shows this:

---------------------------------------------

org.osgi.service.blueprint.container.ServiceUnavailableException: Timeout
expired when waiting for mandatory OSGi service reference:
(&(type=rest)(objectClass=com.dertouristik.dto.engis.commons.errorrenderer.ErrorRenderer))
        at
org.apache.aries.blueprint.container.ReferenceRecipe.getService(ReferenceRecipe.java:226)
        at
org.apache.aries.blueprint.container.ReferenceRecipe.access$000(ReferenceRecipe.java:54)
        at
org.apache.aries.blueprint.container.ReferenceRecipe$ServiceDispatcher.call(ReferenceRecipe.java:291)
        at Proxy5b7cc1fb_451d_4876_8118_a426c5be850a.toString(Unknown Source)
        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]
        at 
org.apache.camel.processor.WrapProcessor.toString(WrapProcessor.java:39)
        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]
        at
org.apache.camel.processor.interceptor.DefaultChannel.toString(DefaultChannel.java:341)
        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]

[Skipped lines not of interrest]

        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]
        at
org.apache.camel.processor.DelegateAsyncProcessor.toString(DelegateAsyncProcessor.java:62)
        at
org.apache.camel.processor.RouteInflightRepositoryProcessor.toString(RouteInflightRepositoryProcessor.java:62)
        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]
        at
org.apache.camel.management.InstrumentationProcessor.toString(InstrumentationProcessor.java:50)
        at java.lang.String.valueOf(String.java:2854)[:1.7.0_09]
        at java.lang.StringBuilder.append(StringBuilder.java:128)[:1.7.0_09]
        at
org.apache.camel.impl.EventDrivenConsumerRoute.toString(EventDrivenConsumerRoute.java:51)
        at
org.apache.camel.management.mbean.ManagedRoute.<init>(ManagedRoute.java:52)
        at
org.apache.camel.management.mbean.ManagedSuspendableRoute.<init>(ManagedSuspendableRoute.java:30)
        at
org.apache.camel.management.DefaultManagementObjectStrategy.getManagedObjectForRoute(DefaultManagementObjectStrategy.java:116)
        at
org.apache.camel.management.DefaultManagementLifecycleStrategy.onRoutesRemove(DefaultManagementLifecycleStrategy.java:537)
        at org.apache.camel.impl.RouteService.doStop(RouteService.java:192)
        at
org.apache.camel.support.ChildServiceSupport.stop(ChildServiceSupport.java:74)
        at
org.apache.camel.support.ChildServiceSupport.stop(ChildServiceSupport.java:98)
        at 
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:112)
        at
org.apache.camel.util.ServiceHelper.stopAndShutdownService(ServiceHelper.java:158)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:1740)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:1765)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:1753)
        at
org.apache.camel.impl.DefaultCamelContext.doStop(DefaultCamelContext.java:1616)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:91)
        at
org.apache.camel.blueprint.BlueprintCamelContext.destroy(BlueprintCamelContext.java:109)

---------------------------------------------

The problem now is in the org.apache.camel.processor.WrapProcessor which
invokes the toString() method of the already uninstalled OSGi service.

A really simple workaround is to replace

<process ref="osgiService"/>

with

<to uri="bean:osgiService"/>


Kind regards
Dominik



--
View this message in context: 
http://camel.465427.n5.nabble.com/Blueprint-route-not-shutdown-when-using-OSGi-service-processor-tp5746114.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to