Richard - I’ll pull up my test project in the morning and put some more examples in the JIRA ticket. The ticket I created for this is https://issues.apache.org/jira/browse/CAMEL-9570
> On Feb 10, 2016, at 5:10 PM, Richard Davidson <richard.davidson...@gmail.com> > wrote: > > Quinn, regarding the other issues, it would be good to get as many examples > of the issues as possible. I plan have a go at fixing this tomorrow evening > so. Is there a JIRA ticket for this issue, or has it just been a discussion > on the mailing list? > > > On Thu, Feb 11, 2016 at 12:05 AM, Richard Davidson < > richard.davidson...@gmail.com> wrote: > >> No I plan to only proxy the service if it is available in the camel >> OsgiServiceRegistry and therefore not using blueprint. That way it can >> change in the background. >> Beans that are obtained in the BlueprintContainer registry will have a >> blueprint proxy and will be unchanged from what they where before. >> >> Thanks, >> Richard >> >> On Wed, Feb 10, 2016 at 11:55 PM, Quinn Stevenson < >> qu...@pronoia-solutions.com> wrote: >> >>> If I’m understanding this correctly, you’re suggesting a proxy around the >>> references for ALL services - whether Blueprint has already proxied them or >>> not. Am I understanding you correctly? If I am, it seems a bit wasteful >>> to re-do what Blueprint is already doing for us. >>> >>> The other really strange part was when I brought the Bean Component into >>> the mix. If I didn’t inject the reference into the route building and then >>> called the bean using to( “bean://..” ), I’d get the >>> ServiceUnavailableException I expect. But just injecting the reference >>> breaks the behavior - even when use the Bean Component. >>> >>> I have some other strange examples of what works and what doesn’t if >>> they’d help. I didn’t put them in the ticket because I didn’t want to >>> confuse matters. >>> >>> >>>> On Feb 10, 2016, at 8:15 AM, Richard Davidson < >>> richard.davidson...@gmail.com> wrote: >>>> >>>> Yes I agree. Creating a proxy like blueprint which wraps a service >>> tracker >>>> is the best option as it allows other beans in the context to keep the >>>> reference to the service. Otherwise the beans would need to be totally >>>> stateless and lookup the registry every time. >>>> >>>> On Wed, Feb 10, 2016 at 2:55 PM, Christian Schneider < >>>> ch...@die-schneider.net> wrote: >>>> >>>>> Hi Richard, >>>>> >>>>> I thought the issue was created by you but it was by Quinn. >>>>> >>>>> I think we really have to avoid caching services. Especially as this >>> can >>>>> cause problems with classloader cleanup when a bundle is uninstalled. >>>>> So I think we either need to put a proxy into the service registry >>> like in >>>>> blueprint or we need to react on the event when the service is removed >>> and >>>>> clean it from the registry. >>>>> >>>>> Christian >>>>> >>>>> >>>>> On 10.02.2016 15:49, Richard Davidson wrote: >>>>> >>>>>> 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 >>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> -- >>>>> Christian Schneider >>>>> http://www.liquid-reality.de >>>>> >>>>> Open Source Architect >>>>> http://www.talend.com >>>>> >>>>> >>> >>> >>