从 EJB 异步方法访问会话 bean 成员变量
Access session bean member variable from EJB asynchronous method
我有一个 @SessionScoped bean (CDI),我想从 EJB @Asynchronous 方法访问和更新它。如果我通过 @Asynchronous 方法的参数传递对 bean 中成员变量的引用并使用它,假设传入的对象是线程安全的,还有其他我应该注意的问题吗?
如果使用 @ViewScoped bean,是否有任何不同需要注意?
我唯一能想到的是 CDI 会话 Bean 是否超时,但这应该不是问题,因为该对象将被保留,因为 @Asynchronous 方法仍然引用它。
我正在尝试完成一项很长的 运行 任务,以免阻止用户点击按钮,但仍会使用作业结果更新会话模型,以便用户可以看到"job viewer" 类型界面中的结果。
永远不要从后端 类 访问前端 类。
只需将回调传递给 EJB 方法。
@Asynchronous
public void asyncDoSomething(SomeInput input, Consumer<SomeResult> callback) {
SomeResult result = doSomethingWith(input);
callback.accept(result);
}
public void yourSessionScopedBeanMethod() {
yourEjb.asyncDoSomething(input, this::setResult);
}
public void setResult(SomeResult result) {
this.result = result;
}
我有一个 @SessionScoped bean (CDI),我想从 EJB @Asynchronous 方法访问和更新它。如果我通过 @Asynchronous 方法的参数传递对 bean 中成员变量的引用并使用它,假设传入的对象是线程安全的,还有其他我应该注意的问题吗?
如果使用 @ViewScoped bean,是否有任何不同需要注意?
我唯一能想到的是 CDI 会话 Bean 是否超时,但这应该不是问题,因为该对象将被保留,因为 @Asynchronous 方法仍然引用它。
我正在尝试完成一项很长的 运行 任务,以免阻止用户点击按钮,但仍会使用作业结果更新会话模型,以便用户可以看到"job viewer" 类型界面中的结果。
永远不要从后端 类 访问前端 类。
只需将回调传递给 EJB 方法。
@Asynchronous
public void asyncDoSomething(SomeInput input, Consumer<SomeResult> callback) {
SomeResult result = doSomethingWith(input);
callback.accept(result);
}
public void yourSessionScopedBeanMethod() {
yourEjb.asyncDoSomething(input, this::setResult);
}
public void setResult(SomeResult result) {
this.result = result;
}