felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Eric Norman <eric.d.nor...@gmail.com>
Subject Re: Constructor injection with multivalue
Date Sat, 22 Sep 2018 01:50:36 GMT
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 <david.daniel.1979@gmail.com>
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 <david.a.jencks@gmail.com>
> 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 <david.daniel.1979@gmail.com
> >
> > 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 <eric.d.norman@gmail.com>
> > > 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 <
> > david.daniel.1979@gmail.com>
> > >> 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: users-unsubscribe@felix.apache.org
> > For additional commands, e-mail: users-help@felix.apache.org
> >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message