You may also experiment with using a "policy = ReferencePolicy.DYNAMIC"
property on the reference annotation. I usually do this on a set of
bind/unbind methods to avoid all the restarting when the referenced
services come and go. You'd just need to be a bit more careful with
synchronizing the usage of the referenced services within your component
class when the referenced service could come or go at any time.
For example, I usually use something like this:
private List<String> svcReflist = new ArrayList<>();
@Reference(cardinality=ReferenceCardinality.OPTIONAL, policy =
ReferencePolicy.DYNAMIC, policyOption=ReferencePolicyOption.GREEDY)
protected void bindHandlerFactory(IHandlerFactory svc) {
svcReflist.add(svc);
}
protected void unbindHandlerFactory(IHandlerFactory svc) {
svcReflist.remove(svc);
}
Regards,
-Eric
On Fri, Sep 21, 2018 at 6:01 PM David Daniel <[email protected]>
wrote:
> Thank you David and Eric,
> So what I did was set the ReferncePolicyOption to greedy so the service
> is restarted everytime a new item is added to the List. This seems to
> match your second suggestion of adjusting the code to take account of
> dynamic referenced service appearance although it seems like a lot of
> restarting eg. if I have 50 web endpoints the component will restart 50
> times. I did not completely understand the first suggestion. I do know at
> buildtime the size of the list and the items in the list. Are you saying
> that there is a way to tell configadmin the minimum number of items in the
> list before starting the component.
>
> Thanks,
> David
>
>
> On Fri, Sep 21, 2018 at 8:34 PM David Jencks <[email protected]>
> wrote:
>
> > startlevel is not an appropriate solution for this problem.
> >
> > Your original code doesn’t show the use of the service tracker. Your
> > replacement code appears to assume that every referenced service is
> already
> > present at activation. In order to assure this I suggest you supply your
> > component with a mandatory configuration specifying
> > <targetname>.cardinality.minimum, or adjust your code to take account of
> > dynamic referenced service appearance and disappearance. I don’t know
> how
> > the new R7 features work with this property but I’d be surprised if
> > constructor injection didn’’t take it into account.
> >
> > david jencks
> >
> > > On Sep 21, 2018, at 5:16 PM, David Daniel <[email protected]
> >
> > wrote:
> > >
> > > Adding a cardinality did not seem to solve the issue. It appears to be
> > an
> > > issue with the startlevel as stopping and starting the bundle worked
> and
> > > the only bundle that started before it was added. Is there an example
> of
> > > the new R7 startlevel stuff in felix. I would like to give the bundle
> I
> > > want loaded last a start level of 5 or something.
> > >
> > > Thanks,
> > > David
> > >
> > > 45|Active | 1|web.server (1.0.0.SNAPSHOT)|1.0.0.SNAPSHOT
> > > 46|Active | 1|web.ui.site (1.0.0.SNAPSHOT)|1.0.0.SNAPSHOT
> > > 47|Active | 1|web.ui.qr (1.0.0.SNAPSHOT)|1.0.0.SNAPSHOT
> > > g! stop 45
> > >
> > > 20:11:57
> > > 20:12:09.153 [pipe-stop 45] INFO Events.Service.web.server:? -
> > > ServiceEvent UNREGISTERING [com.mobigov.web.server.HandlerBuilder]
> > > 20:12:09.164 [ixDispatchQueue] INFO Events.Bundle.web.server:? -
> > > BundleEvent STOPPED
> > > g! start 45
> > >
> > > 20:12:09
> > > 20:12:16.266 [pipe-start 45] INFO Events.Service.web.server:? -
> > > ServiceEvent REGISTERED [com.mobigov.web.server.HandlerBuilder]
> > > 20:12:16.285 [pipe-start 45] INFO
> > c.mobigov.web.server.HandlerBuilder:31 -
> > > Adding Handler for: /communication
> > > 20:12:16.286 [pipe-start 45] INFO
> > c.mobigov.web.server.HandlerBuilder:31 -
> > > Adding Handler for: /web.ui
> > > 20:12:16.286 [pipe-start 45] INFO
> > c.mobigov.web.server.HandlerBuilder:31 -
> > > Adding Handler for: /qr
> > > 20:12:16.287 [pipe-start 45] INFO
> > c.mobigov.web.server.UndertowServer:42 -
> > > Directory exists
> > > 20:12:16.299 [ixDispatchQueue] INFO Events.Bundle.web.server:? -
> > > BundleEvent STARTED
> > >
> > > On Thu, Sep 20, 2018 at 11:30 PM Eric Norman <[email protected]>
> > > wrote:
> > >
> > >> Are those the SCR annotations, or the newer official OSGi declarative
> > >> service annotations?
> > >>
> > >> In either cause, I suppose you'd need to to adjust the cardinality
> > property
> > >> on the @Reference annotation to tell it you want multiple service
> > >> references.
> > >>
> > >> Regards,
> > >> -Eric
> > >>
> > >> On Thu, Sep 20, 2018 at 7:42 PM David Daniel <
> > [email protected]>
> > >> wrote:
> > >>
> > >>> I had switched form a servicetracker to constructor injection of a
> list
> > >>> with scr 2.1.6 . The servicetracker got all the services correctly
> but
> > >> the
> > >>> list is only getting 1. I was wondering if I did not understand
> > >> something
> > >>> or if there was an open bug.
> > >>>
> > >>> Thanks for any help,
> > >>> David
> > >>>
> > >>> From
> > >>>
> > >>> try {
> > >>> mBundleContext = bc;
> > >>> String filterString = "(" + Constants.OBJECTCLASS + "=" +
> > >>> IHandlerFactory.class.getName() + ")";
> > >>> Filter filter = bc.createFilter(filterString);
> > >>> tracker = new ServiceTracker(bc, filter, this);
> > >>> tracker.open();
> > >>>
> > >>> } catch (InvalidSyntaxException e) {
> > >>> if (log != null) {
> > >>> log.log(LogService.LOG_ERROR, e.getMessage());
> > >>> }
> > >>> }
> > >>>
> > >>> To
> > >>>
> > >>> @Activate
> > >>> public HandlerBuilder(@Reference List<IHandlerFactory>
> > handlerFactories)
> > >> {
> > >>> pathHandler.addExactPath("/", new Forwarding());
> > >>> pathHandler.addExactPath("/manifest.json", new Manifest());
> > >>> for(IHandlerFactory handler : handlerFactories) {
> > >>> if (handler.Type().equals("path")) {
> > >>> if (handler instanceof IPathHandlerFactory) {
> > >>> logger.info("Adding Handler for: " + ((IPathHandlerFactory)
> > >>> handler).Prefix
> > >>> ());
> > >>> pathHandler.addPrefixPath(((IPathHandlerFactory) handler).Prefix(),
> > >>> handler.
> > >>> Get());
> > >>> }
> > >>> }
> > >>> }
> > >>> }
> > >>>
> > >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
> >
>