0

使用 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 不是更合适吗?

困惑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");

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

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

4

1 回答 1

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

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

3.

  • 您需要 bean 的远程接口
  • 配置 glassfish 以允许使用特定凭据在特定端口上进行远程调用
  • 对此设置执行 JNDI 查找
于 2016-02-28T09:52:15.267 回答