celix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian Michael <brian.m7...@gmail.com>
Subject Re: Service Factory Question
Date Thu, 06 Aug 2020 14:41:12 GMT
Alexander,

Sorry for the delay in getting back to you. I’ve been trying to do some testing on my end
with this. So I have built a service factory with both calls (celix_bundelcontext_registerServiceFactory
& bundelcontext_registerServiceFactory) and they both give the same result in that they
won’t spin up more than 1 service. I am currently using the Remote Service Admin functionality
and launching my Java application twice inside of Eclipse (with different ports assigned and
2 different Eclipse instances) and making 2 separate calls over to my C application. 

I may not be doing your #2 below with the service tracking though. Is this needed with RSA
or is something happening in the background to take care of this through your discovery/topology
manager?

Interceptors have proven to me that the call is coming through it’s just not spinning up
a new service. 

I’ll look into service tracking today. Please respond and let me know if you think this
is what could be wrong. 

Thanks,
Brian

Sent from my iPhone

> On Aug 4, 2020, at 4:01 AM, Alexander Broekhuis <a.broekhuis@gmail.com> wrote:
> 
> Hi Brian,
> 
> Before answering your questions, I think it is important to realize that
> most of the framework logic is handled on 1 thread. So in your example,
> using a factory (multiple services) is not enough. You would still need to
> spin up a thread in the service yourself.
> 
> Functionally there should be no difference between the 2. The celix_
> prefixed functions are newer, with the added namespace, but also with an
> easier api to register services. So those are better to use. Do you
> experience any issues/differences with either call?
> 
> In short, it should work like this:
> 
> 1) create a new service factory and register, see eg for an old api example:
> bundles/logging/log_service_v2/src/log_service_activator.c:115
> bundles/logging/log_service_v2/src/log_factory.c
> 
> 2) user registered service using a service tracker or dependency manager
> 
> For each new bundle using the service, a new instance is made. Perhaps this
> is where the problem is, the new service is created per using bundle. My
> previous reply didn't mention that.
> So if the consumers are from the same bundle, they will all get the same
> service (and not a new instance). See the javadoc for the factory at [1].
> 
> [1]:
> https://docs.osgi.org/javadoc/r4v42/org/osgi/framework/ServiceFactory.html
> 
> Op ma 3 aug. 2020 om 21:55 schreef Brian Michael <brian.m7065@gmail.com>:
> 
>> Alexander,
>> 
>> What is the functionality difference between:
>> celix_bundelcontext_registerServiceFactory
>> bundelcontext_registerServiceFactory
>> 
>> Also. I’m wanting the new service spin up per other bundle calling this
>> service. So I have org.Algo1 that wants this C service and I have org.Algo2
>> that also wants this C service. From reading up it appears that the service
>> factory is what I want I think but I built one inside of Celix and it
>> doesn’t appear to be making a new service when I perform the multiple
>> calls.
>> 
>> Thanks,
>> Brian
>> 
>> Sent from my iPhone
>> 
>>> On Aug 3, 2020, at 10:37 AM, Alexander Broekhuis <a.broekhuis@gmail.com>
>> wrote:
>>> 
>>> Hi Brian,
>>> 
>>> Most of the services concepts follow the OSGi Specifications [1]. A lot
>> of
>>> theory can be found there.
>>> 
>>> Regarding your question, a service factory does not provide a new service
>>> for each call, but for each service reference. So each component
>> requesting
>>> a service provided by a service factory, will get its own instance. This
>> is
>>> regardless of the usage of a service tracker or dependency manager etc.
>>> 
>>> While it is possible to get a new service for each of the calls, I wonder
>>> if that is what you want. Reading your scenario, something like a
>>> threadpool makes more sense. There are no restrictions to adding a
>>> threadpool inside a component yourself, which is then used by function
>>> handling the calls.
>>> 
>>> In utils there is a thpool implementation [2] available, which is used by
>>> some experimental code. I personally don't have any experience with it,
>> but
>>> perhaps it can help you.
>>> 
>>> [1]: https://www.osgi.org/developer/specifications/
>>> [2]: https://github.com/Pithikos/C-Thread-Pool/
>>> 
>>> 
>>> 
>>> 
>>> 
>>> Op za 1 aug. 2020 om 17:38 schreef Brian Michael <brian.m7065@gmail.com
>>> :
>>> 
>>>> Hello,
>>>> 
>>>> I have a question in regards to the service factory capabilities. I want
>>>> to have Celix churn up a new service for each call that is coming in. An
>>>> example would be say I have a function that is just stuck in a while
>> loop
>>>> for 3 minutes before it exits and it prints stuff to screen. I want to
>> be
>>>> able to have multiple calls coming in and running. Currently the
>> incoming
>>>> calls have to wait their turn in order to use the service. Does the
>> service
>>>> factory churn up a new service per call to take care of this or do I
>> need
>>>> to go another route?
>>>> 
>>>> Thanks,
>>>> Brian
>>>> 
>>>> Sent from my iPhone
>>> 
>>> 
>>> 
>>> --
>>> Met vriendelijke groet,
>>> 
>>> Alexander Broekhuis
>> 
> 
> 
> -- 
> Met vriendelijke groet,
> 
> Alexander Broekhuis

Mime
View raw message