On Nov 20, 11:24 am, William Pietri <
will...@scissor.com> wrote:
> Do you have an opinion on Jesse's proposed solution, the one involving
> Guava? I don't yet know enough about Guice's internals to know whether
> your discovery means that his approach would also founder on the same
> rocks you uncovered.
I'm just trying to get my head around it now. I guess the idea is that
you would move all initialization activity into a start() method and
use the lifecycle stuff to call all the start() methods in parallel. I
guess it's a start -- no pun intended -- but in its current state, 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.
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?
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.
--tim