我可以从创建的Thread访问SessionScoped CDI bean吗?

时间:2014-11-04 21:56:47

标签: java multithreading

我有一个带有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.1Java EE 6。我只想弄清楚这一点,而不是给自己造成麻烦。

0 个答案:

没有答案