I'd agree if you are using a service constantly, it doesn't makes sense to
release it after each use. It is less clear when it is not a constant need.

Of course, HttpService perhaps causes acute pain since it is from a time
before the whiteboard pattern...

-> richard
 On Apr 28, 2014 9:54 PM, "Thomas Watson" <tjwat...@us.ibm.com> wrote:

> I meant for any service that maintains state for the duration of usage for
> each using bundle.  Luckily that is not common for the services that the
> OSGi specification defines.  HttpService is probably the most commonly used
> one that has to maintain state for using bundles.  Regardless of that,
> using a pattern that will constantly get/unget the same service over and
> over cannot perform as well as using some higher level API like
> SerivceTracker or declarative models like DS, or if you must use raw
> BundleContext APIs then caching it yourself.  If it is a rarely used
> service and you don't need it that often then I guess using the get/unget
> each time is not that costly, but it still does not seem like something we
> would want to recommend for services that are often used.  Regardless of
> how cheap it is to construct there is still more code you have to run to
> construct and get it each time.
>
> Tom
>
>
>
> [image: Inactive hide details for Richard Hall ---04/28/2014 08:08:47
> PM---If you only meant for registering resources with the HttpSer]Richard
> Hall ---04/28/2014 08:08:47 PM---If you only meant for registering
> resources with the HttpService, then i can agree with that. :-)
>
> From: Richard Hall <he...@ungoverned.org>
> To: Equinox development mailing list <equinox-dev@eclipse.org>
> Date: 04/28/2014 08:08 PM
> Subject: Re: [equinox-dev] bug or not
> Sent by: equinox-dev-boun...@eclipse.org
> ------------------------------
>
>
>
> If you only meant for registering resources with the HttpService, then i
> can agree with that. :-)
>
> -> richard
>
> On Apr 28, 2014 8:59 PM, "Thomas Watson" 
> <*tjwat...@us.ibm.com*<tjwat...@us.ibm.com>>
> wrote:
>
>    But for the HttpService I consider this an anti-pattern.  When a
>    bundle's usecount reaches zero the HttpService implementation must
>    unregister all resources registered by that bundle.  If that is really what
>    the webconsole bundle wants then that is fine and I agree with you.  But if
>    the webconsole has resources (servlets) it does not want unregisered then
>    it better keep its usecount of the service (it is still using to serve
>    resources) greater than zero.
>
>    Tom
>
>
>
>    [image: Inactive hide details for "Richard S. Hall" ---04/28/2014
>    05:34:25 PM---On 4/28/14, 17:37 , Thomas Watson wrote: >]"Richard S.
>    Hall" ---04/28/2014 05:34:25 PM---On 4/28/14, 17:37 , Thomas Watson wrote: 
> >
>
>    From: "Richard S. Hall" <*he...@ungoverned.org* <he...@ungoverned.org>>
>    To: Equinox development mailing list 
> <*equinox-dev@eclipse.org*<equinox-dev@eclipse.org>
>    >
>    Date: 04/28/2014 05:34 PM
>    Subject: Re: [equinox-dev] bug or not
>    Sent by: *equinox-dev-boun...@eclipse.org*<equinox-dev-boun...@eclipse.org>
>    ------------------------------
>
>
>
>    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
>
>
>
>       [image: Inactive hide details for Raymond Auge ---04/28/2014
>       04:26:50 PM---I agree that I should NOT have to implement this code. 
> Howev]Raymond
>       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 
> *<raymond.a...@liferay.com>*<raymond.a...@liferay.com>
>       To: Equinox development mailing list 
> *<equinox-dev@eclipse.org>*<equinox-dev@eclipse.org>
>       Date: 04/28/2014 04:26 PM
>       Subject: Re: [equinox-dev] bug or not
>       Sent by: 
> *equinox-dev-boun...@eclipse.org*<equinox-dev-boun...@eclipse.org>
>
>
>       ------------------------------
>
>
>
>       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 <
>       *raymond.a...@liferay.com* <raymond.a...@liferay.com>> wrote:
>
>
>
>          On Mon, Apr 28, 2014 at 5:17 PM, Thomas Watson <
>          *tjwat...@us.ibm.com* <tjwat...@us.ibm.com>> 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
>
>
>
>             [image: Inactive hide details for Raymond Auge ---04/28/2014
>             03:24:26 PM---Hey all, I have to write code as follows in a 
> ServiceFactory]Raymond
>             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 
> <*raymond.a...@liferay.com*<raymond.a...@liferay.com>
>             >
>             To: Equinox development mailing list <
>             *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>>
>             Date: 04/28/2014 03:24 PM
>
>             Subject: [equinox-dev] bug or not
>             Sent by: 
> *equinox-dev-boun...@eclipse.org*<equinox-dev-boun...@eclipse.org>
>
>
>             ------------------------------
>
>
>
>             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
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<https://dev.eclipse.org/mailman/listinfo/equinox-dev>
>
>
>             _______________________________________________
>             equinox-dev mailing list
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<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
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<https://dev.eclipse.org/mailman/listinfo/equinox-dev>
>
>
>
>       _______________________________________________
>       equinox-dev mailing list
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<https://dev.eclipse.org/mailman/listinfo/equinox-dev>
>
>    _______________________________________________
>    equinox-dev mailing list
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<https://dev.eclipse.org/mailman/listinfo/equinox-dev>
>
>
>    _______________________________________________
>    equinox-dev mailing list
> *equinox-dev@eclipse.org* <equinox-dev@eclipse.org>
> *https://dev.eclipse.org/mailman/listinfo/equinox-dev*<https://dev.eclipse.org/mailman/listinfo/equinox-dev>
>    _______________________________________________
>    equinox-dev mailing list
>    equinox-dev@eclipse.org
>    https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
>
>
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@eclipse.org
> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
>
_______________________________________________
equinox-dev mailing list
equinox-dev@eclipse.org
https://dev.eclipse.org/mailman/listinfo/equinox-dev

Reply via email to