Hi, Firstly:
Why does DiagramRestApp do this? > @Override > public Set<Object> getSingletons() { > return Collections.singleton(this); > } That is just all kinds of wrong! Secondly, you’re using String properties everywhere rather than the annotations. This is asking for trouble with typos and inconsistencies. Next: The following: > @Component( > service = CommonDiagramRESTService.class, > property = { > "osgi.jaxrs.extension=true", > "osgi.jaxrs.name > <http://osgi.jaxrs.name/>=CommonDiagramRESTService", > "osgi.jaxrs.application.select=(osgi.jaxrs.name > <http://osgi.jaxrs.name/>=DiagramRestApp)" > } > ) > @Path("/common") > public final class CommonDiagramRESTService {..} and > @Component( > service = GridDiagramRESTService.class, > property = { > "osgi.jaxrs.extension=true" , > "osgi.jaxrs.name > <http://osgi.jaxrs.name/>=GridDiagramRESTService", > > "osgi.jaxrs.application.select=(osgi.jaxrs.name > <http://osgi.jaxrs.name/>=DiagramRestApp)" > } > ) > @Path("/grid") > public final class GridDiagramRESTService {...} These types declare that they are extensions - why? They don’t advertise any extension interfaces. They should advertise themselves as resources (which is what they are). I would not expect these to be picked up properly by the whiteboard as they are not extensions and they don’t advertise being resources. > What I observe is that the filter got activated 25 times, although all the > resource classes and the filter bind to the same jaxrs application. Is this > normal? Depending on the underlying implementation of the whiteboard and the registration order of the services this may or may not happen. Some JAX-RS implementations are not dynamic, in this case the whole application must be bounced when a change occurs. This will result in the currently registered services being discarded and re-created. Best Regards, Tim > On 30 Jan 2019, at 15:01, Nhut Thai Le <n...@castortech.com> wrote: > > Tim, > > I have one jaxrs application: > @Component( > service = Application.class, > property= { > "osgi.jaxrs.name <http://osgi.jaxrs.name/>=DiagramRestApp", > "osgi.jaxrs.application.base=/diagram/services/diagrams/rest" > } > ) > public final class DiagramRestApp extends Application { > @Override > public Set<Object> getSingletons() { > return Collections.singleton(this); > } > } > but multiple resource classes, about 25 of them, here is one > @Component( > service = CommonDiagramRESTService.class, > property = { > "osgi.jaxrs.extension=true", > "osgi.jaxrs.name > <http://osgi.jaxrs.name/>=CommonDiagramRESTService", > "osgi.jaxrs.application.select=(osgi.jaxrs.name > <http://osgi.jaxrs.name/>=DiagramRestApp)" > } > ) > @Path("/common") > public final class CommonDiagramRESTService {..} > > and another one: > @Component( > service = GridDiagramRESTService.class, > property = { > "osgi.jaxrs.extension=true" , > "osgi.jaxrs.name > <http://osgi.jaxrs.name/>=GridDiagramRESTService", > > "osgi.jaxrs.application.select=(osgi.jaxrs.name > <http://osgi.jaxrs.name/>=DiagramRestApp)" > } > ) > @Path("/grid") > public final class GridDiagramRESTService {...} > > and finally my jaxrs filter: > @Component( > service = { > ContainerRequestFilter.class, > ContainerResponseFilter.class > }, > scope = ServiceScope.PROTOTYPE, > property = { > "osgi.jaxrs.extension=true", > "osgi.jaxrs.name <http://osgi.jaxrs.name/>=DiagramRestFilter", > "osgi.jaxrs.application.select=(osgi.jaxrs.name > <http://osgi.jaxrs.name/>=DiagramRestApp)" > } > ) > @PreMatching > @Priority(Priorities.AUTHENTICATION) > public final class DiagramRestFilter extends OsgiJaxrsBearerTokenFilterImpl > implements ContainerResponseFilter {..} > > What I observe is that the filter got activated 25 times, although all the > resource classes and the filter bind to the same jaxrs application. Is this > normal? > > Thai > > On Tue, Jan 29, 2019 at 11:17 AM Nhut Thai Le <n...@castortech.com > <mailto:n...@castortech.com>> wrote: > Thank you for clarifying. > > Thai > > > > On Tue, Jan 29, 2019 at 10:24 AM Tim Ward <tim.w...@paremus.com > <mailto:tim.w...@paremus.com>> wrote: > Hi, > > As described in the JAX-RS Whiteboard spec > <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#d0e133685> > JAX-RS extension instances are required to be singletons (I’m talking about > the objects, not the services) by the JAX-RS specification itself. Therefore > within an application you will only ever see one instance of a whiteboard > extension service. > > The reason that you should make extension services prototype is therefore not > related to per-request handling, but instead because of what happens when the > same extension service is applied to *multiple applications*. In this > scenario you will have multiple applications with different configuration and > different context objects. If your extension service is injected with these > objects by the JAX-RS runtime (for example being injected with the > Application using @Context) then which application is that for? In the > general case you have no idea whether the context object you have been > injected with relates to the current request or not. > > If your extension service is singleton or bundle scoped then the JAX-RS > whiteboard can only get one instance. It therefore has to use this same > instance for all of the whiteboard applications and you run into the > potential “multiple injections” trap. This is obviously fine if you don’t > have any injection sites, or if all your injection sites are method > parameters, but it is a risky thing to do as someone may add an injection > site later without realising that they’ve broken things. This will probably > also make it through testing as you’ll typically only have one application at > a time when testing! > > If your extension service is prototype scope then the JAX-RS Whiteboard is > able to get a different instance to use in each whiteboard application. At > this point you no longer need to worry about multiple injections because the > injections happen on different instances. > > I hope this answers your question, and helps to further explain why prototype > scope is a good thing for filters! > > Best Regards, > > Tim > >> On 29 Jan 2019, at 15:18, Raymond Auge via osgi-dev <osgi-dev@mail.osgi.org >> <mailto:osgi-dev@mail.osgi.org>> wrote: >> >> I'm going to assume you are talking about: >> >> HttpService[1] or Http Whiteboard[2] w.r.t. the reference to Servlet >> AND >> JAX-RS Whiteboard[3] w.r.t. the reference to ContainerRequestFilter >> >> These 2(3) features are separate concerns and the ContainerRequestFilter of >> the JAX-RS whiteboard spec doesn't apply to the Servlets of the Http >> Whiteboard. You probably just want a regular old servlet Filter[4] >> >> Now it's possible that you are talking about some other runtime that packs >> all these things together. If so, you probably want to ask the implementors >> about this. >> >> Hope that helps clear things up, >> - Ray >> >> [1] https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html> >> [2] >> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html> >> [3] https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html> >> [4] >> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121055 >> >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121055> >> >> On Tue, Jan 29, 2019 at 9:59 AM Nhut Thai Le via osgi-dev >> <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote: >> Hello, >> >> I have a component implementing ContainerRequestFilter to intercept REST >> calls and another component implements servlet.Filter. Both have PROTOTYPE >> scope, my understanding is that these filter are instantiated and activated >> for each web request but yesterday when i put some breakpoints in the >> @activate method, i did not see them get called when a web request arrives. >> Did I miss something? If they are not init/activate per request why are they >> recomeded to be prototype? >> >> Thai Le >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> <https://mail.osgi.org/mailman/listinfo/osgi-dev> >> >> -- >> Raymond Augé <http://www.liferay.com/web/raymond.auge/profile> (@rotty3000) >> Senior Software Architect Liferay, Inc. <http://www.liferay.com/> (@Liferay) >> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org/> (@OSGiAlliance) >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> <https://mail.osgi.org/mailman/listinfo/osgi-dev> > > > -- > Castor Technologies Inc > 460 rue St-Catherine St Ouest, Suite 613 > Montréal, Québec H3B-1A7 > (514) 360-7208 o > (514) 798-2044 f > n...@castortech.com <mailto:n...@castortech.com> > www.castortech.com <http://www.castortech.com/> > > CONFIDENTIALITY NOTICE: The information contained in this e-mail is > confidential and may be proprietary information intended only for the use of > the individual or entity to whom it is addressed. If the reader of this > message is not the intended recipient, you are hereby notified that any > viewing, dissemination, distribution, disclosure, copy or use of the > information contained in this e-mail message is strictly prohibited. If you > have received and/or are viewing this e-mail in error, please immediately > notify the sender by reply e-mail, and delete it from your system without > reading, forwarding, copying or saving in any manner. Thank you. > AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est > confidentiel, peut être protégé par le secret professionnel et est réservé à > l'usage exclusif du destinataire. Toute autre personne est par les présentes > avisée qu'il lui est strictement interdit de diffuser, distribuer ou > reproduire ce message. Si vous avez reçu cette communication par erreur, > veuillez la détruire immédiatement et en aviser l'expéditeur. Merci. > > > -- > Castor Technologies Inc > 460 rue St-Catherine St Ouest, Suite 613 > Montréal, Québec H3B-1A7 > (514) 360-7208 o > (514) 798-2044 f > n...@castortech.com <mailto:n...@castortech.com> > www.castortech.com <http://www.castortech.com/> > > CONFIDENTIALITY NOTICE: The information contained in this e-mail is > confidential and may be proprietary information intended only for the use of > the individual or entity to whom it is addressed. If the reader of this > message is not the intended recipient, you are hereby notified that any > viewing, dissemination, distribution, disclosure, copy or use of the > information contained in this e-mail message is strictly prohibited. If you > have received and/or are viewing this e-mail in error, please immediately > notify the sender by reply e-mail, and delete it from your system without > reading, forwarding, copying or saving in any manner. Thank you. > AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est > confidentiel, peut être protégé par le secret professionnel et est réservé à > l'usage exclusif du destinataire. Toute autre personne est par les présentes > avisée qu'il lui est strictement interdit de diffuser, distribuer ou > reproduire ce message. Si vous avez reçu cette communication par erreur, > veuillez la détruire immédiatement et en aviser l'expéditeur. Merci.
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev