【发布时间】:2017-11-23 10:41:33
【问题描述】:
我是 Vaadin 框架和 Java EE 的新手。 我正在使用在 TomEE 7.0.2 服务器上运行的 Vaadin Framework 8.1.6、Vaadin-CDI 插件 2.0.0。 我正在尝试使用 EJB 托管线程池(ManagedExecutorService)进行异步/后台数据加载。 我在使用一些注入的 bean 时遇到问题。
所有注入的 bean 在单线程 UI 中都可以正常工作。当我想在后台线程中使用一些注入的bean时,其中一些无法访问。
Vaadin-CDI 用户界面
@CDIUI("")
@Theme("myuitheme")
@Push
public class MyUI extends UI {
// ...
@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
public static class MyUIServlet extends VaadinCDIServlet {
}
}
数据服务
@NormalUIScoped
public class DataService {
// consts, functions, ...
public Data getData(String param) {
// call REST service, load, decode and aggregate data
// ...
}
}
我的视图
@CDIView(value=MyView.VIEWNAME, supportsParameters=true)
public class MyView extends Panel implements View {
public final static String VIEWNAME = "main";
@Resource
private ManagedExecutorService executor;
@Inject
private MyUI ui;
@Inject
private DataService dataService;
public void fun1() {
System.out.println("fun1, thread_id: " + Thread.currentThread().getId());
Future<Data> dataFuture = executor.submit(() -> loadData(param));
// ...
}
private Data loadData(String param) {
// launched in executor thread
System.out.println("loadData, thread_id: " + Thread.currentThread().getId());
// accessing injected ui works fine, the ui is updated correctly
ui.access(() -> {
clearMyView();
}
// accessing injected dataService doesn't work
// exception: java.lang.IllegalStateException
Data data = dataService.getData(param);
ui.access(() -> {
updateMyView(data);
}
return data;
}
//...
}
日志
fun1, thread_id: 77
加载数据,thread_id:102
例外
java.lang.IllegalStateException:会话数据不可恢复 数据服务,WebBeansType:MANAGED,名称:null,API 类型:[xxx.DataService,java.lang.Object], 限定符:[javax.enterprise.inject.Default,javax.enterprise.inject.Any] 在 com.vaadin.cdi.internal.UIScopedContext.getContextualStorage(UIScopedContext.java:68) 在 org.apache.deltaspike.core.util.context.AbstractContext.get(AbstractContext.java:113) 在 com.vaadin.cdi.internal.AbstractVaadinContext.get(AbstractVaadinContext.java:154) 在 com.vaadin.cdi.internal.ContextWrapper.get(ContextWrapper.java:49) 在 org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:101) 在 org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.get(NormalScopedBeanInterceptorHandler.java:71) 在 xxx.myui.data.DataService$$OwbNormalScopeProxy0.getData(xxx/myui/data/DataService.java) 在 xxx.myui.view.MyView.loadData(MyView.java:855) 在 xxx.myui.view.MyView.lambda$27(MyView.java:645) 在 org.apache.openejb.threads.task.CUCallable$1.call(CUCallable.java:34) 在 org.apache.openejb.threads.task.CUTask.invoke(CUTask.java:100) 在 org.apache.openejb.threads.task.CUCallable.call(CUCallable.java:31) 在 java.util.concurrent.FutureTask.run(Unknown Source) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(未知来源)
怎么了?
【问题讨论】:
标签: asynchronous ejb vaadin cdi vaadin8