情形: 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是唯一的。 所以在集群环境中它并没有给我这个保证。
答案 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结束会话之前不会为任何其他客户端提供服务 - 例如通过销毁。