This is exactly the case. Our Declarative Services implementation maintains a single background thread which is responsible for binding references and activating components.
So, yes, here you generally will not get a bind or unbind call while in the activate method. I chose this implementation to minimize the risks for deadlocks to the absolute possible minimum. For example a service REGISTERED event is received in the thread which registers the service, which may well be the thread starting the bundle (if the service registered by a bundle activator). Such a service registration may lead to the satisfaction of a component and thus to another serice registration and bind etc. etc. So instead of just letting this waterfall flow, each bind and/or undind is queue and then sequentally handled. But again: Don't take this for granted, this is an implementation speciality of the Felix SCR implementation. At always keep in mind: A service may come or may go at any point in time. Regards Felix Richard S. Hall schrieb: > I am not sure if this has anything to do with Felix per se, it sounds > like more of a feature of the SCR implementation. Perhaps SCR queues its > work, in which case, the activate would be processed before the bind. > > -> richard > > On 3/7/09 9:35 AM, Reto Bachmann-Gmür wrote: >> experimenting with felix I found that dynamic dependencies are not >> injected while the acivate method is being executed. >> >> The experiment code >> >> /** >> * @scr.component >> * @scr.reference name="component" cardinality="0..n" policy="dynamic" >> * interface="java.lang.Object" target="(testing=true)" >> */ >> public class Main { >> >> protected void bindComponent(Object component) { >> System.out.print("binding component"); >> } >> >> protected void unbindComponent(Object component) { >> System.out.print("unbinding component"); >> } >> >> protected void activate(ComponentContext context) { >> System.out.print("starting"); >> try { >> Thread.sleep(30 * 1000); >> } catch (InterruptedException ex) { >> ex.printStackTrace(); >> } >> System.out.print("finished starting"); >> } >> } >> >> when I activate the above component and an injectable component >> immediately after, the output "binding component" will only appear after >> "finished starting". >> >> Is this a felix specific behaviour that is not guaranteed by the >> specifications? >> >> Regards, >> Reto >> >> >> >> Neil Bartlett said the following on 03/05/2009 11:09 AM: >> >>> It depends. If your component uses the "static policy" then the >>> binds/unbinds will not happen concurrently with the >>> activate/deactivate methods. >>> >>> However, if you use "dynamic" policy then they certainly can happen >>> concurrently and you need to write your component to be thread-safe. >>> >>> Regards >>> Neil >>> >>> On Thu, Mar 5, 2009 at 9:52 AM, Reto Bachmann-Gmür >>> <reto.bachm...@trialox.org> wrote: >>> >>> >>>> I guess a simple question: is it guaranteed that the >>>> activate,deactivate, the bind- and unbind methods of a component are >>>> not >>>> called synchronously? >>>> >>>> Cheers, >>>> Reto >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org >>>> For additional commands, e-mail: users-h...@felix.apache.org >>>> >>>> >>>> >>>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org >>> For additional commands, e-mail: users-h...@felix.apache.org >>> >>> >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org >> For additional commands, e-mail: users-h...@felix.apache.org >> >> > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@felix.apache.org For additional commands, e-mail: users-h...@felix.apache.org