JavaEE RequestScoped Bean在@Asynchronous新线程中的注入来源问询
@Asynchronous EJB线程中RequestScoped Bean的注入来源(OpenLiberty环境)
核心结论
你在@Asynchronous EJB方法对应的新线程中注入的RequestScoped Bean,既不会复用触发异步调用的原请求中的实例,也不会拉取其他最近请求的已有实例,而是由容器全新初始化的独立实例。
具体原理
- Java EE规范明确要求
RequestScoped上下文的生命周期严格绑定到单个请求线程,@Asynchronous标注的EJB方法由容器分配独立的线程池线程运行,和触发异步调用的原请求线程完全隔离,默认不会继承原请求的上下文数据。 - OpenLiberty作为规范兼容实现,会为每个异步EJB方法调用自动创建一个独立的临时请求上下文:
- 该临时上下文的生命周期和异步方法的执行周期完全对齐,方法启动时激活,方法执行结束后销毁
- 异步线程中注入的所有
RequestScopedBean,都会在这个临时上下文中完成初始化,和其他请求的Bean实例完全隔离
- 如果你没有主动配置上下文传递机制,异步线程完全感知不到原请求的
RequestScopedBean存在,也不可能访问到对应实例。
验证方式
你可以给对应的RequestScoped Bean添加@PostConstruct注解,在初始化方法中打印实例哈希值或者唯一标识,分别在原请求方法和异步方法中打印注入的Bean实例标识,就能看到两者是完全不同的实例,且每次异步调用都会触发一次新的初始化。
内容的提问来源于stack exchange,提问作者Dedyshka
相关产品推荐
相关产品推荐

