我有一个带有SessionScoped
bean的Web应用程序,它可以完成一些工作。在我的JSF页面上,我有一个按钮,我希望客户端能够推送并在页面上AJAX
更新工作进度。
我解决这个问题的想法是创建一个实现Runnable的新类,该类调用SessionScoped bean的业务方法。我将JSF页面上的提交按钮连接到一个RequestScoped bean,它创建一个新的Thread并启动我的Runnable。
这种方法的问题是SessionScoped bean的成员变量需要由新线程更新。这是我尝试过的。
@Named
@SessionScoped
public class Worker
{
public workMethod();
}
@Named
@RequestScoped
public class Submitter
{
@Inject
private Worker worker;
public startWork()
{
(new Thread(Runner(this.worker))).start();
}
}
public class Runner implements Runnable
{
private Worker worker = null;
public Runner(Worker w)
{
this.worker = w;
}
public start()
{
this.worker.workMethod();
}
}
当我尝试调用workMethod时,这会导致WELD错误:
org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
我正在使用Glassfish 3.1
,Java EE 6
。我只想弄清楚这一点,而不是给自己造成麻烦。