【问题标题】:EJB async thread with Vaadin, inject not working (Vaadin 8, Vaadin-CDI, EJB ManagedExecutorService thread)带有 Vaadin 的 EJB 异步线程,注入不起作用(Vaadin 8、Vaadin-CDI、EJB ManagedExecutorService 线程)
【发布时间】: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


    【解决方案1】:

    注释@NormalUIScoped有什么具体原因吗?如果不是,则此更改有效

    // @NormalUIScoped // why is this ?
    @UIScoped @Stateful
    public class DataService {
       ...
    }
    

    【讨论】:

    • 谢谢。看来这工作正常。根据 Vaadin-CDI 文档 (https://vaadin.com/docs/v8/framework/advanced/advanced-cdi.html),我一直在使用 @NormalUIScoped@UIScoped 似乎是注入直接 bean 引用的受限版本,@NormalUIScoped 是注入代理对象的“正常”CDI 方式。但是这个代理在另一个线程中运行时无法找到它的 bean。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多