在使用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事件总线,为此我需要调用方法。 似乎没有办法检查,如果我已经订阅,并且我不能在某个实例上两次调用订阅。 有没