【问题标题】:Confused about the use of @Remote in an EAR对在 EAR 中使用 @Remote 感到困惑
【发布时间】:2016-02-28 07:35:28
【问题描述】:

使用 NetBeans,我成功运行了 Oracle 网站上 Java EE 6 教程中介绍的购物车示例。它是一个具有两个模块的 EAR:一个 EJB 模块和一个应用程序客户端模块。我已经缩短了代码的一些细节,以便专注于我面临的困惑。首先,下面是代码。

EJB 模块中的远程接口

package cart.ejb;

import cart.util.BookException;
import java.util.List;
import javax.ejb.Remote;

@Remote
public interface Cart {
  public void initialize(String person) throws BookException;

  public void initialize(
     String person,
     String id) throws BookException;

  public void addBook(String title);

  public void removeBook(String title) throws BookException;

  public List<String> getContents();

  public void remove();
}

EJB 模块中的有状态会话 bean

package cart.ejb;

import cart.util.BookException;
import cart.util.IdVerifier;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;


@Stateful
public class CartBean implements Cart {
  List<String> contents;
  String customerId;
  String customerName;

  public void initialize(String person) throws BookException {
   .................
  }

  public void initialize(
     String person,
     String id) throws BookException {
   .....................
  }

  public void addBook(String title) {
    contents.add(title);
  }

  public void removeBook(String title) throws BookException {
    .................
  }

  public List<String> getContents() {
    return contents;
  }

  @Remove()
  public void remove() {
    contents = null;
  }
}

应用客户端模块中的客户端

package cart.client;

import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import cart.ejb.Cart;
import cart.util.BookException;


public class CartClient {
   @EJB
   private static Cart cart;

   public CartClient(String[] args) {
   }

   public static void main(String[] args) {
     CartClient client = new CartClient(args);
     client.doTest();
   }

   public void doTest() {
     ..................
   }
}

现在我的困惑开始了!

Confusion-1:教程说它是一个远程客户端。但事实并非如此!它与 EJB 模块被打包为同一个 EAR 中的一个模块。 @Local 不是更合适吗?

Confusion-2:如果 glassfish 确实认为它是客户端和会话 bean 之间的远程通信,那么客户端的容器是否会提供代表实际实例的会话 bean 的假实例(即代理) EJB 容器中的会话 bean,就像在“真实的”远程案例中一样?我的意思是,远程是否意味着远程,不管怎样?

Confusion-3:我正在考虑在非 EE 环境中创建一个客户端,然后让它从 EAR 外部与 bean 进行通信,以体验“真正的”远程.那么,如果我启动 Eclipse 并通过从 EAR 中的客户端复制内容来创建 Java SE 7 客户端程序,这些是我必须进行的更改吗?

替换依赖注入

@EJB
private static Cart cart;

使用 JNDI

private static Cart cart = (Cart) InitialContext.lookup("java:global/cart/cart-ejb/CartBean/Cart");

并在 Java 标准版客户端项目中添加 Cart 接口的源代码。

Confusion-4:我找不到那个 EAR 文件的位置。在 NetBeans 上,我可以看到购物车下有两个 jar 文件。但是,EAR 文件在哪里?我通过使用 NetBeans 从 C:\glassfish-4.1.1\docs\javaee-tutorial\examples\ejb\cart 直接打开项目来部署该项目。

【问题讨论】:

    标签: dependency-injection java-ee-6 ear stateful-session-bean


    【解决方案1】:
    1. @Local 就足够了,是的,显然他们对演示很懒惰并选择将其全部打包。无论如何,您的部署单元是您 @Local 接口的范围,因此同一容器中的 2 个不同 EARS 无法访问彼此的 @Local 接口

    2. 是与否:外部行为将与真正的远程案例完全相同(具有对象的序列化和代理),但如何在幕后真正处理取决于容器的实现。据我所知,大多数容器都会利用这样一个事实,即即使它是 @Remote,它也位于同一个 JVM 中,因此例如它们不会进行实际的远程套接字连接。

    3.

    • 您需要 bean 的远程接口
    • 配置 glassfish 以允许使用特定凭据在特定端口上进行远程调用
    • 针对此设置执行 JNDI 查找

    【讨论】:

    • 具有特殊凭据的特定端口?如果我没有创建 Java SE 客户端应用程序,而是简单地从 EAR 中取出应用程序客户端模块并作为独立模块运行,以便与 EJB 模块进行通信,那么我是否需要这样做,这将是唯一的模块在我取出客户端后在 EAR 中?
    • 不,在这种情况下,您只需要从分离的客户端应用程序进行可移植的 JNDI 查找(WAR 就可以了,您不需要客户端的 EAR,但请确保将远程接口最好作为 JAR 库)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2023-02-05
    • 2019-09-13
    相关资源
    最近更新 更多