posts - 51, comments - 17, trackbacks - 0, articles - 9
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JBoss3.0 下配置和部署EJB简介

Posted on 2007-02-28 10:59 chenweicai 阅读(407) 评论(0)  编辑  收藏

JBoss3.0 下配置和部署 EJB 简介

1.JBoss简介

JBoss 是一个运行 EJB J2EE 应用服务器。它是开放源代码的项目,遵循最新的 J2EE 规范。从 JBoss 项目开始至今,它已经从一个 EJB 容器发展成为一个基于的 J2EE 的一个 web 操作系统( operating system for web ,它体现了 J2EE 规范中最新的技术,并且它还在 the JavaWorld Editors' Choice 2002 评选中获得“最佳 Java 应用服务器”大奖。无论是学习还是应用, JBoss 为我们提供了一个非常优秀的平台。有关 JBoss 的详细信息请参阅其主页 http://www.jboss.org

       刚开始使用 JBoss 进行 EJB 开发时,由于可供参考的资源不是很多,所以有一个比较困难的起步阶段。 JBoss 的配置和使用没有提供图形向导界面,所以开发部署 EJB 相对比较复杂。本文通过尽量具体的演示来对 JBoss3.0 下的 EJB 开发和部署的进行一个简单的介绍,从而使刚开始使用 JBoss 的用户可以很快地进入到真正的 J2EE 应用开发中。

由于本文主要介绍 JBoss3.0 中不同类型 EJB 的配置和部署,不对基本的 EJB 开发做太多的描述,所以希望读者具有 J2EE EJB 的经验。想要了解有关信息请查阅参考资料 1

2.JBoss3.0中基本的ejb配置和部署

根据 J2EE 规范的要求,一个基本的 ejb jar 包使用的描述文件是 ejb-jar.xml web 应用的 war 包使用的是 web.xml 企业应用的 ear 包使用的是 application.xml 。这些配置文件都是中性的和平台无关的。同时应用服务器可以使用一些其他的配置文件用于描述特定服务器的相关信息。 JBoss 中这样的文件有 jboss.xml jboss-web.xml JBoss 容器中这些文件不是必须的,如果提供了那么 jboss.xml ejb-jar.xml 放在同一目录下, jboss-web.xml web.xml 放在同一目录下。关于 jboss.xml jboss-web.xml 的规范请参考 JBoss 安装目录下 docs/dtd/ 目录下的对应的 DTD 文件。

2.1 JBoss中关于EJB客户端的配置:

调用 EJB 的客户端可以是 JSP Servlet 或客户端应用程序。如果客户端和服务器不在同一个 Java VM 上,那么在客户端必须提供一个 jndi.properties 文件告诉客户端进行有关 JNDI 命名服务的信息,并且把这个文件所在目录设定到环境变量 classpath 中。

以下是一个 jndi.properties 的样例:

				
						java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
				
		
				
						
								
										java.naming.provider.url=localhost:1099 
								
						
				
				
						(
						服务器地址和端口号
						)
				
		
				
						java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
				
		

通过这个文件和 JBoss 的一些客户端类库,就可以使用 JBoss 提供的 EJB 对象服务了。

2.2 JBoss中部署EJB:

首先介绍 JBoss 容器中部署各类 EJB 对象的两种方法。下面的演示以 Session Bean 为例,客户端是一个本机上的 web 应用。这里不对演示程序进行具体介绍。

第一种方式:

把开发好的 ejb jar 包和 web 应用的 war 包公共放在 deploy 目录下。

演示 1 :不需要 jboss.xml 文件和其他任何特殊的设置。

ejb-jar.xml:

<ejb-jar>

       ······

              <ejb-name>ejbtest</ejb-name>

       ······

</ejb-jar>

客户端: web 应用中对 web.xml 不需要添加 ejb 信息,不需要 jboss-web.xml 文件。引用 ejb 对象的 jsp 文件如下:

       ······

       InitialContext ctx = new InitialContext();

       Object objref  = ctx.lookup("ejbtest");        // 使用 <ejb-name>
       beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);

       ······

 

演示 2 :使用 jboss.xml 文件。

在缺省情况下 JBoss JNDI 服务将通过 ejb-jar.xml <ejb-name>XXX</ejb-name> 中的 XXX 来使用 EJB home interface 但是如果有多个 ejb 对象在相同的 ejb jar 包中,在 ejb-jar.xml 中通过 <ejb-name>XXX</ejb-name> 就可能不能很好的表示某一个 ejb 对象,所以一般我们希望可以提供一些附加的信息,例如采用这样的格式 "[ 应用名 ]/[bean ]" 来引用一个 EJB 对象。这时 JNDI 服务就可能不能正确地找到你的 ejb 对象,我们就需要使用 jboss.xml 文件,通过它实现 jndi 名到 ejb 名的重定向。这个文件必须和 ejb-jar.xml 一起放到 META-INFO 目录下。

ejb-jar.xml:

<ejb-jar>

       ······

       <ejb-name>ejbtest</ejb-name>

       ······

</ejb-jar>

jboss.xml:

<jboss>

       <ejb-name>ejbtest</ejb-name>

       <jndi-name>example/ejbtest</jndi-name>

</jboss>

 

客户端:需要使用新的 jndi 名进行 ejb 定位。

······

       InitialContext ctx = new InitialContext();

       Object objref  = ctx.lookup("example/ejbtest");   // 使用 <jndi-name>                            
      
beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);

······

第二种方式:

ejb web 应用包装成一个企业应用包。部署 ear 时可以简单地把通过 application.xml 描述 ejb jar 包和 web 应用的 war 包,同样在 web.war 中不需要提供特殊的信息就可以和第一种方式一样使用 ejb 对象。客户端代码也不需要进行改动。这里不再举例说明。

此外我们可以进行更进一步的部署,这时需要使用到 web.xml jboss-web.xml jboss-web.xml JBoss 提供的一个针对 web 应用进行配置的文件。 jboss-web.xml web.xml 一起放在 web 应用的 WEB-INF 目录下

演示 1 :改动 web.xml 文件,添加 <ejb-ref> 标记,不使用 jboss-web.xml 文件。

(注意 <ejb-ref> 包括内部引用和外部引用。如果是同一个单元的可以通过 <ejb-link> 直接进行引用,而不用提供其他信息。)

web.xml:

······

<ejb-ref>

           <ejb-ref-name>ejb/ejbtest</ejb-ref-name>  <!-- 采用 sun 推荐的命名方式 -->

        <ejb-ref-type>Session</ejb-ref-type>

        <home>org.zcx.test.zcxejb1Home</home>

        <remote>org.zcx.test.zcxejb1</remote>

        <ejb-link>ejbtest</ejb-link>    <!-- 必须和被应用的 ejb-name 匹配 -->

</ejb-ref>

······

客户端:由于在 web.xml 中引入 ejb 引用描述这时 ejb 定位发生了变化:

······

       InitialContext ctx = new InitialContext();

       Object objref  = ctx.lookup("java:comp/env/ ejb/ejbtest ");// 使用 java:comp/env 命名空间        beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);

······

 

演示 2 :联合使用 web.xml jboss-web.xml

web.xml

······

<ejb-ref>

<ejb-ref-name>ejb/ejbtest</ejb-ref-name>  <!-- 采用 sun 推荐的命名方式 -->

        <ejb-ref-type>Session</ejb-ref-type>

        <home>org.zcx.test.zcxejb1Home</home>

        <remote>org.zcx.test.zcxejb1</remote>

</ejb-ref>

······

jboss-web.xml

<ejb-ref>

<ejb-ref-name> ejb/ejbtest </ejb-ref-name>

<jndi-name> example/ejbtest </jndi-name> <!-- 这里对应 ejb 对象的 jndi -->

</ejb-ref>

客户端:

       nitialContext ctx = new InitialContext();

       Object objref  = ctx.lookup("java:comp/env/ ejb/ejbtest ");                                           beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);

 

以上的所有演示说明了 ejb-jar.xml jboss.xml web.xml jboss-web.xml 之间的基本关系和它们的使用方式。它们是部署各类 ejb 对象的关键文件。接下来介绍针对不同类型的 ejb 对象所需要的特殊配置。

3.JBoss3.0中对于CMP2.0 Entity Bean的有关配置

JBoss3.0 JBossCMP 引擎实现了 EJB2.0 CMP2.0 规范。 JBoss3.0 以前的版本 CMP 的引擎是 Jaws ,它通过 standardjaws.xml jaws.xml 进行有关的配置。在新的 JBossCMP 引擎中 Jboss3.0 通过 standardjbosscmp-jdbc.xml josscmp-jdbc.xml 来配置 Entity Bean JBoss3.0 首先处理 standardjbosscmp-jdbc.xml 然后根据 ejb jar 中是否提供 jbosscmp-jdbc.xml 来做进一步处理。通过 standardjbosscmp-jdbc.xml jbosscmp-jdbc.xml 可以为 entity bean 的部署提供如下的功能有:

l         指定所使用的数据源和对应的类型映射

l         指定一些引擎关心的属性

l         指定引擎如何创建和管理数据库表的原则

l         描述 finder ejbSelect 方法

l         指定属性和字段的类型映射

这里主要根据 standardjbosscmp-jdbc.xml/jbosscmp-jdbc.xml 介绍 CMP2.0 的配置方法。 JBoss 中原有的 Jaws 引擎的配置方法和新的 JBossCMP 的配置方法类似。这些文件的具体的信息可以参考 JBoss 安装路径下 \docs\dtd 中对应的 DTD 文件。

3.1增加新的数据源

JBoss 自带的数据库是 Hypersonic 数据库,我们可以增加一些新的数据源。具体的步骤很简单,参照 Jboss 安装目录下 \docs\examples\jca 中的 *-service.xml 文件可以增加找到对应类型的数据库配置样本文件。以 mysql-service.xml 文件为例,它可以配置一个 MySQL 数据库作为 Entity Bean 的数据源。以下演示创建一个名为 MySQLDS MySQL 数据源。

图一是配置好的 mysql-service.xml 文件的一段代码样本,通过属性设置可以定制数据源的名称和有关连接的其他属性。注意该文件中所有 name 属性必须保持一致。

图一 mysql-servic.xml 的样本代码

在配置好这个文件后,把它部署在 JBoss deploy 目录下,把对应的 jdbc 驱动也放在 lib 目录下。重新启动 Jboss 就会加载这个新的数据源。

3.2 Entity Bean 对数据源的使用

第一种方式:

直接改动 standardjbosscmp-jdbc.xml 。把原有的数据源 java:/DefautlDS 屏蔽掉使用新的数据源 java:/MySQLDS 。( Java 前缀是必须的。)不需在其他地方作改动。 JBoss 会实现新的数据源做为缺省的数据源。图二是一个配置好的文件片断。

图二 standardjbosscmp-jdbc.xml 的样本代码

第二种方式:

由于有可能不同的 Entity Bean 使用不同的数据源,而不是都使用同样的缺省配置,所以必须为单独的 Entity Bean 提供定制数据源信息的支持。这时不需要改动 standardjbosscmp-jdbc.xml 文件,可以通过在 Entity Bean jar 包中 META-INFO 目录下添加新的部署文件 jbosscmp-jdbc.xml 来完成。通过这个文件可以描述特定的 Entity Bean 的关于数据源的配置信息。图三是一个配置好的文件片断。

图三 jbosscmp-jdbc.xml 的样本代码

4.JBoss3.0中对于Message Driven Bean的配置

JBoss 中开发 MDB 需要使用 JMS 功能。 JMS Sun 公司开发的面向消息的中间件 API 。它的主要目的是创造一种统一的面向消息编程的 JavaAPI ,从而避免使用提供商特定的 API 。现在有几种不同的 JMS 系统可供使用。 JBoss3.0 中提供的是 JBossMQ

4.1 JBoss3.0中配置JMS服务

JBoss3.0 中与 JMS 服务相关的配置文件包括两个文件: jbossMQ-service.xml jbossMQ-destinations-service.xml jbossMQ-service.xml 配置了 jbossMQ 服务中的核心对象信息。一般我们不需要处理这个配置文件。 jbossMQ-destinations-service.xml 用于定义具体应用所需的目的地信息。通过编辑它我们可以创建新的 Topic Queue 用于具体的 JMS 应用的目的地。在 JBoss 中创建应用特定的 Topic Queues 的步骤比较简单,参照 jbossMQ-destinations-service.xml 文件格式在该文件中添加自己应用程序所需的 Topic 名为 myTestAppTopic Queue 名为 myTestAppQueue 。如图四所示。

图四   jbossMQ-destinations-service.xml 的样本代码

4.2 JBoss3.0中EJB使用JMS服务的配置

在开发 MDB 时要在部署文件中指定所使用的 JMS 服务中的目的地信息。 JBoss 中通过 ejb-jar.xml jboss.xml 共同说明。在 jboss.xml 中通过 <destination-jndi-name> 标记描述所使用的目的地信息。

Ejb-jar.xml

<message-driven>

      <ejb-name>HelloTopicMDB</ejb-name>

      <ejb-class>org.zcx.test.HelloMDB</ejb-class>

      <message-selector></message-selector>

      <transaction-type>Container</transaction-type>

      <message-driven-destination>

        <destination-type>javax.jms.Topic</destination-type>

        <subscription-durability>NonDurable</subscription-durability>

      </message-driven-destination>

</message-driven>

jboss.xml

  <message-driven>

      <ejb-name>HelloTopicMDB</ejb-name>

      <configuration-name>Standard Message Driven Bean</configuration-name>

      <destination-jndi-name>topic/myAppTestTopic</destination-jndi-name>

    </message-driven>

客户端:

······

Context context = new InitialContext();

      // Get the connection factory

      // Create the connection

      // Create the session

······

// Look up the destination

      topic = (Topic)context.lookup("topic/myTestAppTopic");

      // Create a publisher

// Publish the message

······

5.JBoss3.0中EJB使用JavaMail服务的配置。

由于 JBoss 提供了 JavaMail 服务的实现,所以在 JBoss 中使用 JavaMail 是非常方便地。它所需要配置的是 mail.service 文件。这个文件非常地简单不用多介绍。按照 mail.service 文件的的注释就可以顺利地完成配置。

图五是使用 JavaMail 服务的一个 sessionBean 的代码片断

图五   使用 javamail 的样本代码

 

 

以上通过例子简单的介绍了 JBoss3.0 Session Bean Entity Bean Message Drive Bean 最基本的配置和部署方法,通过这些介绍现在已经可以在 JBoss 中进行基本的 EJB 应用的开发了。本文中对于 EJB 应用中比较复杂的一些配置像权限设置、资源管理和 CMP2.0 中的众多配置等都没有涉及到,希望大家可以在不断的实践和交流中更好地掌握 JBoss 的使用和配置。


只有注册用户登录后才能发表评论。


网站导航: