对在EAR中使用@Remote感到困惑

时间:2016-02-28 07:35:29

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

使用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的实际实例,就像在&#34; real&#34;远程案例?我的意思是,远程意味着远程,不管是什么?

困惑-3:我正在考虑在非EE环境中创建一个客户端,然后让它与EAR外部的bean进行通信,以便了解&#34;真实&#34;远程。因此,如果我通过从EAR中的客户端复制内容来启动Eclipse并创建Java SE 7客户端程序,这些是我必须做出的更改吗?

替换依赖注入

@EJB
private static Cart cart;

使用JNDI

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

并在Java Standard Edition客户端项目中添加Cart界面的源代码。

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

1 个答案:

答案 0 :(得分:0)

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

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

  3. 3

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