多个ajax调用jsf2和ejb3.1

时间:2011-06-20 02:04:27

标签: ajax asynchronous concurrency jsf-2

我有多个实时图表。目前,每个图表都有一个链接。当用户单击链接时,将加载相应的图表,并且每5秒进行一次ajax调用以调用viewscoped managedbean中的action方法。当用户单击另一个链接时,将清除先前的setinterval,并为另一个图表重复相同的过程。对于所有这些图表(链接),它们相应的操作方法位于由一个EJB支持的相同viewscoped managedbean中,其中一个服务方法对应于每个操作方法。

到目前为止一切顺利。

下一步是在视图上同时显示所有这些实时图表的链接。现在,我知道会有多个异步ajax调用。我相信servlet(FacesServlet)在一个单独的线程中处理所有这些请求。但是对于managedbean和ejb会发生什么。我是否需要创建单独的托管服务(如果MB是RequestScoped,那么JSF是否为多个异步Ajax请求创建了一个单独的实例)和单独的ejbs?我现在有点困惑,需要一些有用的建议。我希望它们能够同时处理。

谢谢。

更新

首先感谢bogdan.mustiata。

现在,由于我没有得到任何更多的答案,我会尝试更清楚一点。

我真正想要了解的是:

当我有ViewScoped(或SessionScoped)托管bean和无状态EJB时 -

  1. 如何在服务器端处理请求?
  2. 如何在服务器端处理多个异步Ajax请求?
  3. 以下是我的理解 -

    1. 请求被发送到服务器。
    2. FacesServlet为每个请求启动一个线程。
        在那个线程内 -
      1. 执行Managd-bean动作方法。
      2. EJB的实例由容器提供,并且EJB中的相应方法被执行。
      3. 这样可以同时处理多个Ajax请求。

        它是怎么回事?

1 个答案:

答案 0 :(得分:2)

如果你的EJB是@Stateless并不重要,那你就没事了。如果它们是@Session,那么自上次检查(在EJB 3.0中)以来,您就不能同时调用多个有状态EJB方法。有一个名为Seam的框架,它能够序列化对有状态EJB的调用。

您可以将有状态EJB中的方法标记为synchronized,但不建议这样做。由于它是相同的实例,它可能会起作用,但是核心的EJB布道者可能并不高兴。

更新

我读了specification for EJB 3.1和4.3.14的文字:

  

容器序列化对每个有状态和无状态会话bean实例的调用。大多数容器将支持并发执行的会话bean的许多实例;但是,每个实例只能看到序列化的方法调用序列。因此,有状态或无状态会话bean不必编码为可重入。

为了让事情变得更加迷人,它继续说:

  

默认情况下,允许客户端对有状态会话对象进行并发调用,并且需要容器来序列化此类并发请求。请注意,容器永远不允许对实际的有状态会话Bean实例进行多线程访问。

由于我不知道有什么方法可以同时调用服务但没有使用不同的线程,因为实际的调用是阻塞的,我只能假设他们引用你进行调用的代理。

因此,如果你真的想要并行调用代码,简短的答案是你不能使用有状态的EJB ,但是是无状态EJB的开箱即用因为你为每次通话都得到了一个新实例。

<强>更新 您永远不会获得EJB的实例,您总是会获得一个将调用EJB的代理。对于无状态EJB,您的代理最终将为您自己的每个方法调用实例化一个新的无状态EJB,并且EJB代码将每次在新实例上运行。