weld + gf v3 + asynchronous task execution
vadger Apr 1, 2010 8:28 AMHello,
I have a gh v3 with default weld (v 1.0.0). And the situation is following:
I have ITask interface:
public interface ITask<T,R> {
Future<R> execute(T value);
}Implementation:
@Stateless
public class SimpleTask implements ITask<Integer, Integer> {
@Override
@Asynchronous
public Future<Integer> execute(Integer value) {
System.err.println("started ..." + value);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.err.println("completed ..." + value);
return new AsyncResult<Integer>(value * 2);
}
}And a bean that invokes tasks:
@Startup
@Singleton
public class InitBean {
@Inject
ITask task;
@PostConstruct
public void init() {
System.err.println("!!!!!!!!!!! starting up ......");
List<Future<Integer>> tasks = new ArrayList<Future<Integer>>();
for (int i =0; i < 5; i++) {
tasks.add(task.execute(new Integer(i)));
}
}
}The expected result is asynchronous task execution (i.e output: started ... 1, started ... 2 ..., completed 1, completed 2...), but the actual result is synchronous (started ... 1, completed 1, started ... 2, completed 2, etc). Trying to check if future is done whether cancelled I'm getting: IllegalStateException: Object does not represent actual Future.
Removing the interface from SimpleTask and using it directly, i.e:
@Stateless
public class SimpleTask {
@Asynchronous
public Future<Integer> execute(Integer value) {
System.err.println("started ..." + value);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.err.println("completed ..." + value);
return new AsyncResult<Integer>(value * 2);
}
}works as expected to be working (i.e. asynchronously). Is it a bug? Or ejb feature? If it is not a bug, how can I overcome such limitation? I want to make some kind of pooled task executor (input is ITask instance with asynchronous invocation, List of objects to be executed by ITask and pool size). Relying on gf pooling is not sufficient (64 threads may be too much, I want to limit, for example, with 5 tasks at a time).
Any help is appreciated.
Thanks,
Vadim