远程EJB的理解

Understanding of remote EJB

我正在玩 JBoss 和 EJB,我使用 jboss-eap-quickstarts

我有 server-side class:

package org.jboss.as.quickstarts.ejb.remote.stateless;

import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {

    @Override
    public int add(int a, int b) {
        return a + b;
    }

    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}

我有client-side方法:

private static RemoteCalculator lookupRemoteStatelessCalculator() throws NamingException {
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    final Context context = new InitialContext(jndiProperties);
    return (RemoteCalculator) context.lookup(
     "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName()
  );
}

问题是:

  1. 服务器上部署了什么? Class / Object / 两者?如何 客户找到 classes/objects 了吗?
  2. ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName()是如何帮助的,所以它不知道 host:port
  3. server 上执行 CalculatorBean 逻辑的位置或 client 边?同样,如果它是在 Server 处执行的,那么它是如何 两个 jvm 之间的值交换有效吗?
  1. 客户端找到classes/objects因为客户端依赖于服务器端的接口(pom.xml文件)。

  2. 它找到了 host:port 感谢文件 jboss-eap-quickstarts/ejb-remote/client/src/main/resources/jboss-ejb-client.properties 请注意,您可以将服务器配置为在不同的端口公开您的服务

  3. CalculatorBean逻辑会在服务器端执行。

对于我没有回答的所有问题,(什么部署在哪里,jvm 之间的值交换以及 JNDI 地址 (ejb:/ ...) 如何让客户端找到正确的服务),您应该阅读关于 JNDI 和 EJB 的工作原理。

这是一个好的开始:

JNDI: http://www.javaworld.com/article/2076888/core-java/jndi-overview--part-1--an-introduction-to-naming-services.html

EJB: http://www.javaworld.com/article/2071724/java-web-development/ejb-fundamentals-and-session-beans.html

EJB 基于 RMI (remote method invocation) over IIOP that helps bring 进入 java 世界的概念。

在服务器端,分为三部分:

  1. EJB 实现 - 具体 class 包含实现方法。
  2. Home 接口 - 扩展 javax.ejb.EJBHome 的接口必须包含 create() 方法。由客户端代码用于创建 bean 实例。
  3. 远程接口 - 扩展 javax.ejb.EJBObject 的接口,它声明了您希望客户端代码能够访问的所有方法。

在客户端,你必须先lookupejb。这就是 JNDI 的用武之地。不需要 host:port 因为您必须在服务器端的 Java 命名目录中注册 bean。根据您的情况,此注册表使用名称(由 ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName() 表示)创建。

这是服务端发布的,客户端通过它来访问Home界面。这反过来又使您可以访问在远程接口中声明的 bean 中所有已实现的方法。

希望这能解决您的三个问题。