Java EE 中的托管可调用任务中的参数被覆盖
Arguments overridden in managed callable tasks in Java EE
我有几个用 invokeAll
调用的容器管理的可调用任务。我需要将参数传递给这些任务中的每一个,并且由于我正在获取实例而不是手动创建对象(这是一项要求),所以我无法在构造函数中传递参数。
我在任务中使用 setter 来设置值,但由于某些原因,当我有多个任务时,最后一个值会覆盖前一个值。
鉴于此任务:
@Stateless
@LocalBean
public class MyTask implements Callable<String> {
private String value;
@Override
public String call() throws Exception {
System.out.println("MyTask called with value = " + value);
return "MyTask called";
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
调用此 Test
class:
public class Test {
@Inject
Instance<MyTask> myTaskInstance;
@Resource
private ManagedExecutorService executor;
public void test() throws InterruptedException, ExecutionException {
List<Callable<String>> tasks = new ArrayList<>();
MyTask task1 = myTaskInstance.get();
task1.setValue("VAL1");
tasks.add(task1);
MyTask task2 = myTaskInstance.get();
task2.setValue("VAL2");
tasks.add(task2);
List<Future<String>> taskResults = null;
taskResults = executor.invokeAll(tasks);
List<String> results = new ArrayList<>();
for(Future<String> taskResult : taskResults) {
results.add(taskResult.get());
}
}
}
结果是(注意VAL2
两次):
13:04:49,044 INFO [stdout]
(EE-ManagedExecutorService-default-Thread-3) MyTask called with value
= VAL2
13:04:49,045 INFO [stdout]
(EE-ManagedExecutorService-default-Thread-4) MyTask called with value
= VAL2
这段代码有什么问题?如何解决这个问题?
更新
将 bean 更改为 @Stateful
之后,这些是 invokeAll
之前的任务实例
这是完全正常的。
一个 @Stateless
bean 在多个实例中创建,具体取决于您的服务器池配置。
因此从池中重新使用同一个实例。
根据定义,@Stateless
bean 不能 维持状态。
请改用 @Stateful
bean。
我有几个用 invokeAll
调用的容器管理的可调用任务。我需要将参数传递给这些任务中的每一个,并且由于我正在获取实例而不是手动创建对象(这是一项要求),所以我无法在构造函数中传递参数。
我在任务中使用 setter 来设置值,但由于某些原因,当我有多个任务时,最后一个值会覆盖前一个值。
鉴于此任务:
@Stateless
@LocalBean
public class MyTask implements Callable<String> {
private String value;
@Override
public String call() throws Exception {
System.out.println("MyTask called with value = " + value);
return "MyTask called";
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
调用此 Test
class:
public class Test {
@Inject
Instance<MyTask> myTaskInstance;
@Resource
private ManagedExecutorService executor;
public void test() throws InterruptedException, ExecutionException {
List<Callable<String>> tasks = new ArrayList<>();
MyTask task1 = myTaskInstance.get();
task1.setValue("VAL1");
tasks.add(task1);
MyTask task2 = myTaskInstance.get();
task2.setValue("VAL2");
tasks.add(task2);
List<Future<String>> taskResults = null;
taskResults = executor.invokeAll(tasks);
List<String> results = new ArrayList<>();
for(Future<String> taskResult : taskResults) {
results.add(taskResult.get());
}
}
}
结果是(注意VAL2
两次):
13:04:49,044 INFO [stdout] (EE-ManagedExecutorService-default-Thread-3) MyTask called with value = VAL2
13:04:49,045 INFO [stdout] (EE-ManagedExecutorService-default-Thread-4) MyTask called with value = VAL2
这段代码有什么问题?如何解决这个问题?
更新
将 bean 更改为 @Stateful
之后,这些是 invokeAll
这是完全正常的。
一个 @Stateless
bean 在多个实例中创建,具体取决于您的服务器池配置。
因此从池中重新使用同一个实例。
根据定义,@Stateless
bean 不能 维持状态。
请改用 @Stateful
bean。