Hi Christian,

The original ticket was not logged by me, I just commented on the
behaviour. The original issue described at the start of the ticket in which
the service object is being cached exists for scenario 2 and scenario 3.
Both these scenarios find the bean in the OsgiServiceRegistry, so the
 BlueprintContainerRegistry is not used.



On Wed, Feb 10, 2016 at 1:47 PM, Christian Schneider <
ch...@die-schneider.net> wrote:

> Hi Richard,
>
> now I understand your problem. So the problem is only with Scenario 3.
> Can you update the issue to reflect this?
>
> So does the example you mentioned in the issue (which would probably be
> scenario4) really not work?
> I am pretty sure it should work.
>
> Christian
>
>
> On 10.02.2016 12:51, Richard Davidson wrote:
>
>> Hi.
>>
>> Sorry, I may have caused more confusion!. You are correct that if the
>> blueprint registry is used, it will create a proxy, and the service can
>> come and go in the background without any issues. The issue on this ticket
>> is to do with the OsgiServiceRegistry in camel. When camel tries to lookup
>> a component it goes to its registry. This is typically a composite
>> registry
>> which looks up a chain of other registries. When using camel through
>> blueprint the chain is:
>>
>> OsgiServiceRegistry -> BlueprintContainerRegistry
>>
>> The OsgiServiceRegistry does not use blueprint in any way and looks up
>> services in the actual OSGi registry using BundleContext.getService(). It
>> uses the 'name' as the interface to lookup. As the camel
>> OsgiServiceRegistry is first in the chain it will always be checked first.
>> If it can't get the service, it will return null and the blueprint
>> registry
>> will be called. The examples below describe the behaviour:
>>
>> For each scenario I have exported an OSGI service with the interface
>> 'com.test.camel.test.Hello'.
>>
>> <b>Scenario 1</b>
>> If I use the following blueprint, the blueprint registry is used and the
>> service is therefore a proxy:
>> <raw>
>> <reference id="helloBean" interface="com.test.camel.test.Hello" />
>>
>> <camelContext id="blueprintContext" trace="false"
>> xmlns="http://camel.apache.org/schema/blueprint";>
>> <route id="timerToLog">
>> <from uri="timer:foo?period=1000" />
>> <setBody>
>> <method ref="helloBean" method="hello" />
>> </setBody>
>> <log loggingLevel="INFO" message="The message contains ${body}" />
>> </route>
>> </camelContext>
>> </raw>
>>
>> <b>Scenario 2</b>
>> If I use the following route the OSGi registry is used and a direct
>> reference to the bean in the OSGI registry is obtained via the
>> OSGIServiceRegistry in camel.
>> <raw>
>> <camelContext id="blueprintContext" trace="false"
>> xmlns="http://camel.apache.org/schema/blueprint";>
>> <route id="timerToLog">
>> <from uri="timer:foo?period=1000" />
>> <setBody>
>> <method ref="com.test.camel.test.Hello" method="hello" />
>> </setBody>
>> <log loggingLevel="INFO" message="The message contains ${body}" />
>> </route>
>> </camelContext>
>> </raw>
>>
>> <b>Scenario 3</b>
>> If I lookup up a bean name that is available in both registries then I
>> will
>> use the OsgiServiceRegistry, and I will not get a blueprint proxy.
>> <raw>
>>
>> <reference id="com.test.camel.test.Hello"
>> interface="com.test.camel.test.Hello" />
>>
>> <camelContext id="blueprintContext" trace="false"
>> xmlns="http://camel.apache.org/schema/blueprint";>
>> <route id="timerToLog">
>> <from uri="timer:foo?period=1000" />
>> <setBody>
>> <method ref="com.test.camel.test.Hello" method="hello" />
>> </setBody>
>> <log loggingLevel="INFO" message="The message contains ${body}" />
>> </route>
>> </camelContext>
>>
>> </raw>
>>
>>
>>
>> The OsgiServiceRegistry currently caches the service object so if the
>> bundle exporting com.test.camel.test.Hello restarts, then I think the
>> route
>> will fail, but I have not tested this.
>>
>> So I think there are two potential issues:
>> 1. The OsgiServiceRegistry needs to track services.
>> 2. I think the BlueprintContainerRegistry should be first in the chain
>> before the OsgiServiceRegistry. This will mean if the service / bean is
>> present in blueprint it will always take predence over the bean in the
>> OsgiServiceRegistry.
>>
>> On Wed, Feb 10, 2016 at 8:01 AM, Christian Schneider <
>> ch...@die-schneider.net> wrote:
>>
>> If you inject a blueprint reference to a service into a RouteBuilder class
>>> then I would expect that the camel registry is not involved at all
>>> and you would be able to use the service proxy injected by blueprint
>>> inside the route.
>>>
>>> When the service disappears the blueprint proxy should run into
>>> ServiceUnavailableException.
>>>
>>> @Claus: Can you confirm this or am I overlooking something?
>>> This is related to this issue
>>> https://issues.apache.org/jira/browse/CAMEL-9570
>>>
>>> Christian
>>>
>>>
>>> On 09.02.2016 20:32, Quinn Stevenson wrote:
>>>
>>> In reference to the Blueprint proxy - if I use the Camel Bean component
>>>> to call the service (i.e. to( “bean://my-bean” ), and I do NOT inject
>>>> the
>>>> service reference into the route builder, I get the dynamic swap of the
>>>> service implementation.  That (along with reading the Blueprint specs)
>>>> lead
>>>> to me to believe that the service proxy isn’t swapped - just the
>>>> underlying
>>>> service reference.
>>>>
>>>>
>>>> --
>>> 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