65.9K
CodeProject 正在变化。 阅读更多。
Home

EJB 3.0 远程会话 Bean 查找

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (8投票s)

2008年5月1日

CPOL

4分钟阅读

viewsIcon

125179

downloadIcon

1197

本文介绍了一种在简单的 Java 应用程序中执行 EJB 3.0 会话 Bean 远程查找的方法。

引言

EJB 3.0 是实现分布式计算的最强大技术之一。它具有许多很棒的功能。 其中一些功能包括基于注解的编程、持久性 API、采用 Hibernate 作为 OR 映射工具、POJO 对象作为实体、依赖注入和查找、IDE 支持(如 Netbeans 6.0)等等。

想象一下这样一种情况:您的 EJBeans 托管在应用程序服务器上,例如 JBOSS、GlassFish 或 Apache。 您的 Servlet 托管在 Tomcat 上,您的客户端是简单的浏览器,手机向 Servlet 发送请求,Servlet 调用 EJBeans,而 EJBeans 又调用其他 EJBeans,所有这些组件都托管在不同的机器上。您在 Servlet 的 Web 层中使用缓存,在 EJB 层中使用二级缓存,为此您必须设置 EHCACHE 或 memcached 服务器。 这种体系结构的目的在于提供高可伸缩性、可用性和性能,从而能够处理数百万用户。 这一切看起来都非常迷人,但实现起来也具有挑战性。

在本文中,我想讨论 EJB 程序员在实现两个企业应用程序之间的 EJB 会话 Bean 远程查找时面临的问题之一。 我假设读者了解 EJB 3.0 技术以及如何使用它进行编程。 我使用 NetBeans 5.5 和配置好的 JBOSS 应用程序服务器。

问题

问题是您有一个驻留在某个企业应用程序中的会话 Bean。 它具有本地和远程接口。 现在,您想要在另一个客户端 Java 程序中调用该会话 Bean 及其方法,例如企业应用程序、Java 程序或 Web 项目。 这种方法调用也称为远程方法调用。

有两种方法可以实现这一点

  1. 您可以使用 JNDI API 编写查找代码。
  2. 您可以使用 @EJB 注解来获取远程会话 Bean。

我尝试了这两种方法,但我发现第一种方法易于实现,并且被所有支持 EJB 的应用程序服务器广泛接受。 据我所知,JBOSS 不支持使用 @EJB 注解进行远程查找。 只有 GlassFish 支持使用 @EJB 注解进行远程查找。

因此,让我们讨论第一种方法。 我们将查找一个远程 EJB 会话 Bean,并使用一个简单的 Java 客户端程序调用其方法。

Using the Code

附加的源代码包含一个名为 HelloWorld 的 NetBeans 项目。 在此项目中,有一个简单的 EJB 无状态会话 Bean HelloWorldBean。 它有一个业务方法 sayHello

以下是此方法的实现

//
// public String sayHello(String str)
//{
    str="Hello " + str +" Today is "+ (new Date());
    return str;
//}
//

为了通过另一个 Java 程序远程调用此方法,您必须为 HelloWorld bean 提供一个远程接口。

现在让我向您展示用于调用此会话 Bean 的查找代码。 此查找代码位于另一个项目 HelloWorldClient 中,该项目是一个简单的 Java 程序,用于使用我们的 HelloWorldBean

//
 private HelloWorldRemote lookupNewSessionBean() {
        try {
            Context c = new InitialContext();
          
            Properties properties = new Properties();
            properties.put("java.naming.factory.initial",
                "org.jnp.interfaces.NamingContextFactory");
            properties.put("java.naming.factory.url.pkgs",
                "org.jboss.naming rg.jnp.interfaces");
            properties.put("java.naming.provider.url", "jnp://:1099");
            Context ctx = new InitialContext(properties);
            System.out.println("Got context");
            Session.HelloWorldRemote ans=(Session.NewSessionRemote) ctx.lookup(
                "HelloWorld/HelloWorldBean/remote");  
            return ans;
           
        }
        catch(NamingException ne) {
            throw new RuntimeException(ne);
        }
    }
//

以上代码中最重要的内容是查找 string "HelloWorld/HelloWorldBean/remote"。 它由三个部分组成

  • HelloWorld 是包含 HelloWorldBean 实现的应用程序/项目的名称。
  • HelloWorldBean 是您的 EJB Bean 类的名称,该类具有 sayHello 方法。
  • remote 表示您正在寻找一个远程会话 Bean。

关注点

在实现远程查找时,程序员可能会看到以下两个异常。 以下是这些异常的描述以及有关如何解决这些异常的说明。 这些异常特定于 JBOSS 应用程序服务器。

  1. Name not bound Exception(名称未绑定异常)

    当您的 Bean 未正确部署并且未注册到您的 JBOSS 应用程序服务器时,通常会出现此异常。 您可以通过以下步骤确认 Bean 的部署

    1. 转到 https://:8080
    2. 转到 JMX 控制台
    3. 单击 service=JNDIView,然后单击 MBean 操作列表中的调用按钮
    4. 它将打开一个屏幕,显示所有已部署的 Bean。 如果您已成功部署 Bean,则它必须位于您的全局 JNDI 命名空间下。
    5. 类转换异常:$proxy 无法转换为远程 Bean 类型

    当您没有将远程接口正确地放入客户端程序中时,会发生此异常。 为了调用远程会话 Bean,必须将远程接口(包括其包)放入客户端程序中,否则会发生此错误。

附加的源代码文件包含两个 NetBeans 项目。 您可以使用配置了 JBOSS 应用程序服务器的 Netbeans 5.5 或 6.0 IDE 打开它们。

感谢您阅读本文。 我非常感谢您的反馈。

历史

  • 2008 年 5 月 1 日:初始版本
© . All rights reserved.