I decided this was worth blogging about: http://tembrel.blogspot.com/2009/11/concurrently-initialized-singletons-in.html
--tim On Nov 26, 11:36 pm, Tim Peierls <[email protected]> wrote: > William, > > It bothered me to be so close to a solution and not get it, so I tried > again, and this time I figured out how to do it. > > See these snippets for details: > > http://pastie.org/716802http://pastie.org/716803http://pastie.org/716809 > > The last of these illustrates how you might use it. This approach > works when the expensive startup code is in the constructor or in an > injected method. I wouldn't try it with circular dependencies. > > --tim > > On Nov 25, 11:51 am, William Pietri <[email protected]> wrote: > > > > > Hi, folks. Thanks for your comments! > > > Dhanji R. Prasanna wrote: > > > If you like you can try the experimental lifecycle module which takes > > > an executor and calls a bunch of services in parallel. > > Tim Peierls wrote: > > > [...] I > > > don't see how you would deal with interdependencies between > > > Startables, and it seemed like that was the main issue you were hoping > > > Guice could quasi-magically address: Service A needs both Service B > > > and Service C started before it can itself start. > > > Yes, that's the manual work I was hoping to avoid. Once you get past > > some number of services, even though all the dependencies make sense > > individually, it's a lot of head-scratching to put it all together properly. > > > From what you and Dhanji say, it looks my use case is either out of > > scope or bleeding edge for Guice, so I'll pass for now. However, I still > > may try using Guice after parallelizing the high-cost services internally. > > > > What you'd like to be able to say is something like this: > > > > class ServiceA implements Service { > > > private final ServiceB b; > > > private final ServiceC c; > > > @Inject ServiceA(ServiceB b, ServiceC c) { this.b = b; this.c = > > > c; } > > > public void start() throws InterruptedException { > > > waitForStart(b, c); // where waitForStart is a blocking > > > utility method provided the lifecycle machinery > > > expensiveInitialization(b, c); > > > } > > > ... > > > } > > > > Maybe something like this is already there and I just missed it? > > > That would be nice. Actually, in my case, the services currently do all > > their initialization at construction time, so I don't even need the > > ability to wait, but I could see that others would. > > > > During JSR 330 discussions, when I was nattering on about documenting > > > concurrency properties of injection, Bob Lee led me to believe that a > > > parallel injector would be really, really hard to do. So I don't think > > > we'll ever be able to do something like this: > > > > class ServiceA implements Service { > > > @Inject ServiceA(Provider<ServiceB> bp, Provider<ServiceC> c) { > > > expensiveInitialization(bp.get(), cp.get()); > > > } > > > ... > > > } > > > > and have the ServiceB and ServiceC constructions happen in parallel. > > > Hmmm... That's unfortunate, as that would be the ideal scenario for me. > > If all of my dependent services are going to have duplicate code where > > they wait for their dependencies to heat up, I'd love to pull that > > duplication out somewhere, and the dependency injection framework seems > > like the ideal place for that. > > > William -- You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-guice?hl=en.
