无状态EJB和群集

时间:2016-02-06 00:59:15

标签: java ejb

情形: EjbA和EjbB都是远程无状态会话bean。

@Stateless
public class EjbA
{
  @EJB
  private EjbB b;

  public void foo(){
    b.method1();
    b.method1();
    b.method2();
  }
}

这些方法中的任何一个调用b都是正确的 可能发生在集群环境中的不同节点/ VM上?

甚至调用method1?

我的意思是如果某个客户端调用方法foo,它会发生吗? 在此事务中,在node1上调用method1 并在foo()的同一次调用期间调用method1, 转到node2上的Ejb实例?

解释“Enterprise JavaBeans 3.1”中的以下引用:

“... SLSB代理上的每次调用都独立于 之前和之后的那些。实际上,它的底层bean实例 可以在请求之间互换交换。“

我会说是的。

有没有办法确保这些调用发生在同一节点/ VM上的同一个无状态会话bean实例上?

如果我的第一个假设是对的,那就不可能了。

E.g。使用单例仅确保每个VM的Ejb是唯一的。 所以在集群环境中它并没有给我这个保证。

1 个答案:

答案 0 :(得分:1)

  

b上的任何这些方法调用都可以在a上发生,这是否正确?   群集环境中的不同节点/ VM?

是的,方法调用可以是远程的 - 只要你在EjbB上有properly setup the remote interface

  

甚至调用method1?

     

我的意思是如果某个客户端调用方法foo,可能会发生这种情况   事务方法1在node1上调用,下一次调用method1,   在foo()的同一个调用期间,转到node2上的Ejb实例?

     

解释“Enterprise JavaBeans 3.1”中的以下引用:

     

“... SLSB代理上的每次调用都独立于   之前和之后的那些。实际上,它的底层bean实例   可以在请求之间互换交换。“

     

我会说是的。

我100%同意您的评估。事实上,容器实现者可以在每次方法调用时自由创建和销毁无状态会话Bean - 它们彼此独立。

  

有没有办法确保这些调用发生在同一个调用上   无状态会话bean实例

您必须将EJB设为@Singleton。这样您就可以确保每EJB Container Classloader

创建一次
  

在同一节点/ VM上?

是的,您可以确保所有呼叫都是本地的 - 不要定义远程接口。 By default all EJBs only expose local interfaces;这意味着如果你不做任何额外的工作 - 你总是调用本地EJB。

没有可靠的方法来“强制”独立方法调用由同一个无状态Bean处理。如果你试图维持EjbA和EjbB之间的“会话状态”,那么这就是Stateful Session bean的用途。使用有状态会话Bean,方法调用不仅保证由同一个bean处理,而且EjbB将能够记住来自EjbA的方法调用之间的状态。在此设置中,EjbB将完全专用于EjbA的特定实例,并且在EjbA结束会话之前不会为任何其他客户端提供服务 - 例如通过销毁。