Hi Tim, I see!
I was playing around with ConfigurationAdmin and factories for my services. I started with the annotation on the field without the bind/unbind definitions. But then I noticed, that services got only added, but not removed, when I deleted a configuration in ConfigurationAdmin. So I thought, I needed the bind/unbind... I changed the code to have the annotation on the bind method and now it works correctly. Next time I should RTFM or spec respectively instead of fiddling around with the annotations :) Thanks, Henrik Am 20.05.2017 um 21:47 schrieb Tim Ward: > Hi Henrik, > > You are confusing yourself by asking DS for a mixture of field injection, > bind/unbind methods and having non-thread-safe code for a dynamic reference. > > By applying the annotation to the field you are telling DS to inject > references directly into your component's field. You are also telling it to > use bind/unbind methods, which it is also doing. The volatile setting is > likely changing the result of a race condition that was happening before, > where DS injects a one-element collection then starts calling the bind method. > > In your scenario I would strongly recommend not using field injection (you > have bind/unbind methods) by moving the annotation to the bind method. You > can then remove the custom bind attribute value and ensure thread safety by > using a thread safe collection, or with appropriate synchronisation wherever > the list is used. > > I hope this helps. > > Regards, > > Tim > > Sent from my iPhone > >> On 20 May 2017, at 21:22, Henrik Niehaus <henrik.nieh...@gmx.de> wrote: >> >> When I use a Set, bndtools complains, that there is no unbind method, >> even though it's specified. But, in my opinion, using a Set only fixes >> the symptoms, but not the source of the problem... >> >> Using CopyOnWriteArrayList does not make any difference. >> >>> Am 20.05.2017 um 19:42 schrieb Ferry Huberts: >>> >>> >>>> On 20/05/17 18:48, Henrik Niehaus wrote: >>>> I noticed a behavior with SCR, which I don't understand. I'm using a >>>> multiple dynamic reference for a list like this: >>>> >>>> @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = >>>> ReferencePolicy.DYNAMIC, bind="addService", unbind="removeService") >>>> private List<WeatherService> services = new ArrayList<>(); >>> Use a Set<> i.s.o. a List<>. >>> even better would probably be CopyOnWriteArraySet, depending on your >>> usage scenario. >>> >>>> This works as I expect it. All 5 instances get added to the list. >>>> >>>> At startup SCR tells me, that it would be a good idea to make this list >>>> volatile, which makes sense. So I tried that and ended up with 6 >>>> instances in my list, which I don't understand. When I set a breakpoint >>>> in the bind method "addService", it turns out, that the list already >>>> contains an element when it is called the first time. One service is >>>> contained twice in the list. And it is always the service, which is >>>> added at last. Is this intended? Am I doing something wrong? >>>> >>>> - Henrik >>>> >>>> >>>> _______________________________________________ >>>> OSGi Developer Mail List >>>> osgi-dev@mail.osgi.org >>>> https://mail.osgi.org/mailman/listinfo/osgi-dev >>>> >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org > https://mail.osgi.org/mailman/listinfo/osgi-dev _______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev