当前位置: 首页 > 知识库问答 >
问题:

无状态EJB和集群

苏硕
2023-03-14

场景: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上调用方法1,下一个对方法1的调用,在同样的foo()调用期间,转到node2上的Ejb实例?

解释下面引用的"Enterprise JavaBeans 3.1":

"...对SLSB代理的每次调用都独立于之前和之后的调用运行。事实上,它的基础bean实例可以在请求之间互换。"

我会说是的。

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

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

例如,使用单例只能确保每个VM的Ejb是唯一的。所以在集群环境中,它不会给我这种保证。

共有1个答案

施德元
2023-03-14

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

是的,方法调用可以是远程的-只要您在EjbB上正确设置了远程接口

甚至连对method1的调用?

我的意思是,如果一些客户端调用方法foo,是否会发生这样的情况:在这个事务中,在node1上调用方法1,下一个对方法1的调用,在同样的foo()调用期间,转到node2上的Ejb实例?

解释下面引用的"Enterprise JavaBeans 3.1":

"...对SLSB代理的每次调用都独立于之前和之后的调用运行。事实上,它的基础bean实例可以在请求之间互换。"

我会说是的。

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

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

您必须使EJB成为@Singleton。这样可以确保每个EJB容器类加载器只创建一次

在同一个节点/VM上?

是的,您可以确保所有调用都是本地的-不要定义远程接口。默认情况下,所有EJB仅公开本地接口;这意味着如果你不做任何额外的工作,你总是调用本地EJB。

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

 类似资料:
  • 我有一个EJB无状态会话Bean。我有以下要求: 这个无状态EJB应该在启动时初始化 初始化代码应该对数据库进行事务性访问 问题是: @Startup仅适用于@Singleton EJB @PostConstruct注释(至少在WebSphere上)在这一点上没有事务性上下文,所以初始化代码在这里爆炸! 可能的解决方案? 使用JavaEE定时器,但它似乎是为周期性执行而设计的。我只想在零点执行一次

  • 在EJB3.1中,在无状态EJB中有一个同步块可以吗? 同步块用于在出现连接错误时更新连接。

  • 我不理解无状态会话bean。文档说,instances变量可能包含特定于客户机的状态,然后说,当方法完成时,不应该保留状态。

  • 我知道: 对于无状态会话bean,服务器可以在池中维护数量可变的实例。每次客户端请求这样一个无状态bean时(例如通过一个方法),都会选择一个随机实例来服务该请求。 我的问题是:为什么需要游泳池?EJB无状态bean的一个实例不应该足以服务所有请求吗? 另外,如果给定无状态bean的服务器使用的是10个实例的池,那么10是它可以在这样一个bean上处理的最大请求数吗? 你能帮我消除疑虑吗? 编辑:

  • 我有一个ear,它包含2个war文件,每个war都包含无状态ejb和rest类。接口位于commons中。jar文件。耳朵结构如下所示: 我试图使用无状态-ejb-2中的无状态-ejb-1和注释,但我在部署期间遇到了错误。当我在stateless-EJB-2中使用@EJB时,就部署了ear,但在调用jersey-rest-2时,我遇到了一个远程查找错误。 这是我的方法调用链: 泽西-rest-1

  • 我正在尝试将JMS队列注入到无状态EJB中。我的代码看起来是这样的: 当我试图将其部署到应用程序服务器(Wildfly 9.0.2)时,引发了以下异常 如果我将mappedName更改为远程JNDI名称,它就会起作用 或者我将无状态EJB切换到一个依赖的CDI Bean Wildfly配置如下所示: 那么,为什么不能将JMS队列注入到无状态EJB中,为什么它可以在CDI bean中工作呢?我做错了