当前位置: 首页 > 面试题库 >

从线程调用bean时,没有作用域类型javax.enterprise.context.RequestScoped的活动上下文

於彬
2023-03-14
问题内容

在使用Weld-SE 2.1.2.Final获取bean并从线程中调用它时,遇到以下异常:

线程“主”中的异常org.jboss.weld.context.ContextNotActiveException:WELD-001303:作用域类型javax.enterprise.context.RequestScoped没有活动上下文

我的bean用@RequestScooped注释。如果我注释@ApplicationScoped则可以正常工作,但我需要保留@RequestScooped。

这是一个复制器:

public static void main(String[] args) throws Exception {
    Weld weld = new Weld();
    WeldContainer container = weld.initialize();
    final MyPojo pojo = container.instance().select(MyPojo.class).get();

    Thread t = new Thread() {
        public void run() {
            System.out.println(pojo.ping());   // This call fails
        }
    };
    t.start();
    t.join();
    System.out.println(pojo.ping()); // This call succeed
    weld.shutdown();

}

@RequestScoped
public class MyPojo {
 public String ping() {
    return "pong";
 }
}

您是否遇到过这种行为?有什么想法可以使这项工作吗?


问题答案:

在这种情况下,Weld使用的是与线程(RequestContext)关联的未绑定RequestContext
。您需要在创建的线程中手动初始化新的RequestContext,这对我有用:

public static void main(String[] args) throws Exception {
    Weld weld = new Weld();
    final WeldContainer container = weld.initialize();
    RequestContext requestContext= container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get();
    requestContext.activate();

    final MyPojo pojo = container.instance().select(MyPojo.class).get();

    Thread t = new Thread() {
        public void run() {
            RequestContext requestContext= container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get();
            requestContext.activate();
            System.out.println("1" + pojo.ping()); 
        }
    };
    t.start();
    t.join();
    System.out.println("2" + pojo.ping());
    weld.shutdown();

}


 类似资料:
  • 在我的Spring批处理作业中,我试图使用JobExecutionContext在步骤之间共享数据,只有当我将步骤保持为单线程时,它才会起作用,如下所示: 但是,添加时发生错误: 我试着像这样解决这个问题:https://github.com/spring-projects/spring-batch/issues/1335,但它似乎只使用了主线程之外的一个线程。 有没有办法在不添加经过调整的代码的

  • 问题内容: 关于这两个上下文的内容,已经有很多文章了。但是我仍然不太正确。 到目前为止,据我了解:每个实例都是其类的一个实例,这意味着某些程序员建议您尽可能频繁地使用它,以免“泄漏”任何内存。这是因为另一个this(获取Activity实例上下文)指向的Activity是每次用户倾斜手机或离开应用程序等时都将销毁的一个。显然,垃圾收集器(GC)无法捕获,因此使用了过多的内存。 .. 但是任何人都可

  • 我有一个可以从应用程序中启用/禁用的组件。我的spring boot应用程序中的属性。。 在我的应用程序中。我拥有的财产 在组件中看起来像这样 最后,在我使用wikiclient的另一个类中,我在我的构造函数中像这样自动安装了它。 但我还是有例外 如果启用该属性,它的工作方式与启用该组件类似。

  • 问题内容: 我在tomcat中运行一个Web应用程序,其中使用ThreadPool(Java 5 ExecutorService)并行运行IO密集型操作以提高性能。我希望在每个合并线程中使用的某些bean在请求范围内,但是ThreadPool中的Threads无法访问spring上下文并导致代理失败。关于如何使Spring上下文可用于ThreadPool中的线程来解决代理故障的任何想法? 我猜想必

  • Logcat按摩 **从活动上下文外部调用startActivity()需要标志_Activity_NEW_TASK标志。这真的是你想要的吗?

  • 我有一个会话作用域bean,它使用代理注入到单例bean中。 从单例bean中,我需要调用会话作用域bean的某个初始化方法,它需要单例bean作为参数。此外,我不能改变会话范围bean的来源。 为了详细说明这个情况: 单例bean是一个服务,会话范围bean是一个Vaadin4Spring事件总线,为此我需要调用方法。 似乎没有办法检查,如果我已经订阅,并且我不能在某个实例上两次调用订阅。 有没