On 4/28/14, 17:37 , Thomas Watson wrote:
Is your ServiceFactory.ungetService getting called each time? If so
then it is likely the felix webconsole is using an anti pattern like this:
HttpService service = bc.getService(httpServiceRef);
/// do some work with http service
bc.ungetService(httpServiceRef);
Is this really an anti-pattern? It doesn't seem so to me. If so, why
don't we just deprecate ungetService() and tell all bundle implementers
to not worry about ungetting, since they framework will do it for you
when the bundle stops?
The fact that ungetting and recreating may be costly is an issue for the
service implementer, it would seem, not the service consumer. If it
costs a lot to create instances, the service factory could consider
doing caching of instances and reusing them on subsequent requests.
Having client bundles call ungetService when they are done with a
service that they may not use again for a while seems reasonable to me.
-> richard
If they are getting/ungetting the service each time they are
interacting with the service then the usecount for the service goes to
zero for each usage which then causes the framework to free the
service instance object. The should be using something like a
ServiceTracker to avoid this kind of anti-pattern.
Tom
Inactive hide details for Raymond Auge ---04/28/2014 04:26:50 PM---I
agree that I should NOT have to implement this code. HowevRaymond Auge
---04/28/2014 04:26:50 PM---I agree that I should NOT have to
implement this code. However, I'm having to do so in order to work
From: Raymond Auge <[email protected]>
To: Equinox development mailing list <[email protected]>
Date: 04/28/2014 04:26 PM
Subject: Re: [equinox-dev] bug or not
Sent by: [email protected]
------------------------------------------------------------------------
I agree that I should NOT have to implement this code. However, I'm
having to do so in order to work around this apparent issue.
- Ray
On Mon, Apr 28, 2014 at 5:23 PM, Raymond Auge
<[email protected]_ <mailto:[email protected]>> wrote:
On Mon, Apr 28, 2014 at 5:17 PM, Thomas Watson
<[email protected]_ <mailto:[email protected]>> wrote:
You seem to be implementing the work that the framework
already does for ServiceFactory registrations. The framework
will only call your factory once as long as the use count of
the service is greater than zero for a particular bundle. The
framework will then cache that service instance and keep
returning it directly to the bundle without calling the
ServiceFactory again.
Am I understanding your observation correctly? You are
stating that your factory is not called multiple times for the
same consuming bundle?
I'm stating that when a single bundle is deployed which requests
the same service multiple times the factory method is called
multiple times and the bundle gets a different instance of the
service each time.
I'm not sure if there is some sort of race condition but the
client bundle (in this case the felix webconsole) is requesting
the HttpService mutliple times (in the same thread) and each time
the equinox framework is invoking the HttpServiceFactory method
returning different HttpServiceImpl instance.
- Ray
Tom
Inactive hide details for Raymond Auge ---04/28/2014 03:24:26
PM---Hey all, I have to write code as follows in a
ServiceFactoryRaymond Auge ---04/28/2014 03:24:26 PM---Hey
all, I have to write code as follows in a ServiceFactory impl
in order for my
From: Raymond Auge <[email protected]_
<mailto:[email protected]>>
To: Equinox development mailing list
<[email protected]_ <mailto:[email protected]>>
Date: 04/28/2014 03:24 PM
Subject: [equinox-dev] bug or not
Sent by: [email protected]_
<mailto:[email protected]>
------------------------------------------------------------------------
Hey all,
I have to write code as follows in a ServiceFactory impl in
order for my factory to always return the same instance per
bundle running on equinox 3.8.0.v20120529-1548
===============================================
public HttpService getService(
Bundle bundle, ServiceRegistration<HttpService> registration) {
HttpServiceImpl httpServiceImpl = serviceMap.get(bundle);
if (httpServiceImpl != null) {
return httpServiceImpl;
}
httpServiceImpl = new HttpServiceImpl(
bundle, contextController, legacyServiceIdGenerator);
serviceMap.putIfAbsent(bundle, httpServiceImpl);
return httpServiceImpl;
}
===============================================
This seems clearly wrong as per the spec.
It's certainly calling the getService method of the
ServiceFactory which I'm guessing means it's not incorrectly
registered.
What could I be doing wrong? Was this ever a bug in equinox
that was later resolved?
-- _
_*_Raymond Augé_*
<http://www.liferay.com/web/raymond.auge/profile> (@rotty3000)
Senior Software Architect_
_*_Liferay, Inc._* <http://www.liferay.com/> (@Liferay)
_______________________________________________
equinox-dev mailing list_
[email protected]_ <mailto:[email protected]>_
__https://dev.eclipse.org/mailman/listinfo/equinox-dev_
_______________________________________________
equinox-dev mailing list_
[email protected]_ <mailto:[email protected]>_
__https://dev.eclipse.org/mailman/listinfo/equinox-dev_
--
*_Raymond Augé_*
<http://www.liferay.com/web/raymond.auge/profile> (@rotty3000)
Senior Software Architect
*_Liferay, Inc._* <http://www.liferay.com/> (@Liferay)
--
*_Raymond Augé_*
<http://www.liferay.com/web/raymond.auge/profile> (@rotty3000)
Senior Software Architect
*_Liferay, Inc._* <http://www.liferay.com/> (@Liferay)
_______________________________________________
equinox-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/equinox-dev
_______________________________________________
equinox-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/equinox-dev
_______________________________________________
equinox-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/equinox-dev