`

转:JBoss技术支持文档

阅读更多
文章来源:http://java.ccidnet.com/art/3751/20060808/789223_1.html 

应用服务器-JBoss技术支持文档

 1、本节内容简介

 

  本章主要介绍JBOSS(免费的EJB服务器),以及教会大家如何安装Jboss,建立你第一个EJB和客户端。关于什么是EJB,以及如何开发等。这些关于EJB方面有很多书籍进行描述,在此不再阐述。描述信息是运行在windows平台,当然你可以应用在其他支持的平台(如:Linux等)。

  2、关于JBOSS

 

  Jboss支持EJB 1.1和EJB 2.0的规范,它是一个为管理EJB的容器和服务器。类似于Sun’s J2SDK Enterprise Edition(J2EE),但是Jboss核心服务仅是提供EJB服务器。JBOSS不包括serverlers/JSP page 的WEB容器,当然可以和Tomcat或Jetty绑定使用。JBOSS需要比较小的内存和硬盘空间。可以在64M内存以及几兆空间上很好的运行。而 Sun’s J2EE需要最少内存为128M,以及31M硬盘空间。JBOSS启动速度要比J2EE快10倍。而且它能内嵌SQL 数据库服务器进行持久性BEAN处理,当启动时会自动启动。(J2EE装载分离CloudScape SQL Server)。

 

  其中一个非常好的特性JBOSS能够“热”部署,“热”部署的意思就是在部署BEAN只是简单拷贝BEAN的JAR文件到部署路径下,如果BEAN已经被LOAD,JBOSS卸载它,然后LOAD一个新版本BEAN。如果你需要更多的 JBOSS特性,你可以查看关于JBOSS论坛的网站。如果需要支持,可以付费联系JBossGroup LLC。

 

  本章一步一步帮助你开始用jboss进行分布式开发:如何建立一个简单的BEAN,以及如何在jboss服务器上部署和在测试。

 

  3、必备条件

 

  JBOSS是一个纯JAVA编写的,需要一个JAVA系统和JDK1.3兼容。为了能便宜和运行所有的例子,你需要有Ant 1.4或以上版本。在下节将会介绍如何获得和安装。当然你要有开发EJB基础。

  4、安装ANT

 

  我们在很多书上以及网页可能都看见过这个名字,到底它用来作什么的呢?Ant 是一个基于java的build工具。现在已经有了许多的build工具,例如make、gnumake、nmake、jam等,而且这些工具都非常优秀。Ant是一个跨平台的Build工具。之所以Ant能跨平台,是因为Ant不再需要你编写shell命令,Ant的配置文件是基于XML的任务树,能让你运行各种各样的任务,任务的运行是由实现了特定任务接口的对象来完成的。

有两个版本Binary和Source 可以下载最新版本1.5.2。

 

Binary版: http://ant.apache.org/old-releases/v1.5.2/binaries/

Source版:http://ant.apache.org/old-releases/v1.5.2/source/

 

  关于这两个版本的不同之处可以参考http://ant.apache.org/ 。如果下载不了可以向我索取QQ:182244794, Email: amaryllis@163.net 。

 

  在下载完Ant后,你解压文件,全部文件会放在一个apache-ant-1.5.2路径下。Ant文档会释放在docs/manual目录下,你可以打开网页docs/manual/index.html来浏览关于ant文档的内容。我用Windows系统释放在c:/apache-ant-1.5.2路径下。

 

  1) 设置ANT_HOME环境变量,指向你的ANT目录。

 

  2) 需要设置JAVA_HOME环境变量,指向你的JDK目录。

 

  3) 将%ANT_HOME%\bin加入到PATH环境变量中。

 

  4) 当你不带任何参数运行ant时,Ant会在当前目录找一个名叫build.xml的文件。如果没找到,会有以下提示:

 

Buildfile : build.xml does not exist!Build failed

 

  为了测试ANT安装是否成功,我建立了一个新的build.xml文件,放在当前的目录下%ANT_HOME%\samples。Build.xml内容如下:

 

 

<!-- Simple Ant build script to test an Ant installation --><br />

<project name="TestInstall" default="run" basedir="."><br />

<target name="init">  <br />

<available file="ASimpleHelloObject.java" property="ASimpleHelloObject"/> <br />

</target> <br />

<target name="ASimpleHelloObject" unless="ASimpleHelloObject" depends="init"> <br />

<echo file="ASimpleHelloObject.java"><br />

public class ASimpleHelloObject<br />

{<br />

public static void main(String[] args) { <br />

System.out.println("ASimpleHelloObject.main was called"); }<br />

}<br />

</echo> <br />

<echo message="Wrote ASimpleHelloObject.java" /> <br />

</target> <br />

<target name="compile" depends="ASimpleHelloObject"> <br />

<javac destdir="." srcdir="." debug="on" classpath="."> <br />

<include name="ASimpleHelloObject.java"/> <br />

</javac> <br />

</target> <br />

<target name="run" depends="compile"> <br />

<java classname="ASimpleHelloObject" classpath="." /> <br />

<echo message="Ant appears to be successfully installed" /> <br />

</target><br />

</project><br />

 

 

  运行ant 显示结果如下:

 

 

c:\apache-ant-1.5.2\samples> antBuildfile: build.xml

Init :

AsimpleHelloObject:

[echo] Wrote AsimpleHelloObject.java

compile:

[javac] Compiling 1 source file to c:\apache-ant-1.5.2\samples

run :

[java] AsimpleHelloObject.main was called[echo] Ant appears to be successfully installed

BUILDE SUCCESSFUL

Total time :11 seconds.

 

 

  到此你安装的ANT以及环境已经设置成功。如果有以下警告

Warning: JAVA_HOME environment variable is not set. If build fails because sun.* classes could not be found you will need to set the JAVA_HOME environment variable to the installation directory of java.

 

  表示你需要设置JAVA_HOME环境,指定你安装的JDK 目录。如何运用Ant 中的各种命令,我会在以后编写《ANT文档》介绍。

  5、安装JBOSS

 

  1) 在安装和运行JBoss 之前,你必须检查是否安装了JDK,需要在PATH环境中,设置JDK的目录。

 

  2)、 下载JBoss 服务器。JBoss 是一个压缩文件,你可以下载最新版本。为了能支持Web Server,我用的是Windows平台,所以下载了jboss3.0.6-tomcat4.1.18。你可以到http: //prdownloads.sourceforge.net/jboss/ 中直接下载。如果你使用的是Unix/Lunix平台也可以从这个网址下载相应的JBoss 服务器。

 

  3)、安装

 

  (1) Lunix/Unix下安装

 

  a、 你下载了对于Unix/Lunix版本的JBoss 服务器l 用JDK 的JAR工具来解压文件到一个临时目录。

 

  b、 设置JBOSS_DIST指向JBoss 解压后最顶级目录。

 

  c、 然后到此目录下

 

cd JBOSS_DIST/bin

sh run.shl

 

  运行完后显示信息如下:

 

bash-2.04$ /bin/sh run.sh

JBOSS_CLASSPATH=:run.jar:../lib/crimson.jar

jboss.home = /tmp/JBoss-2.2.2

Using JAAS LoginConfig: file:/tmp/JBoss-2.2.2/conf/default/auth.conf

Using configuration "default"

[Info] Java version: 1.3.1,Sun Microsystems Inc.

[Info] Java VM: Java HotSpot(TM) Server VM 1.3.1-b24,Sun Microsystems Inc.

[Info] System: Linux 2.2.16-22,i386

[Shutdown] Shutdown hook added

[Service Control] Registered with server

[Service Control] Initializing 24 MBeans

...

[Service Control] Started 24 services

[Default] JBoss 2.2.2 Started in 0m:7s

 

  (2) Windows下安装

 

  a、 下载jboss3.0.6-tomcat4.1.18.zip, 然后用winzip解压到一个目录,我解压在c:\jboss3.0.6-tomcat4.1.18目录

 

  b、 解压后基本上不需要配置,运用bin目录下的run.bat命令。

 

  c、 运行run.bat命令,请看后台有没有什么异常抛出。

 

  d、运行成功请访问http://localhost:8083将会出现空白页。访问http://localhost:8080将会出现Tomcat的欢迎页面,如果出现Apache Tomcat/4.1.12 - HTTP Status 500 - No Context configured to process this request的错误,这是正常的,因为你还没有发布.ear或.war应用。当然jboss-3.2.ORC3_tomcat-4.1.18.zip不会出现这样的问题,因为在目录server\default\deploy\中自带了web测试文件webtest.ear 访问http://localhost:8082你可以看到Jboss起动的服务。你可以运行http://localhost:8080/jmx- console就会出现相关页面。

 

  (3) Window NT 和2000补充

 

  对于NT和Win2k系统如果你要安装NT或Win2k服务的话,可以把jboss加在系统服务中,避免你每次需要到jboss目录下运行run.bat命令,只是当系统启动时,自动启动jboss服务器。

 

  a、 首先你需要下载javaservice.exe文件。l 编辑一个批处理文件,自己命名文件名,存入和JavaService.exe相同的目录。我命名为Jboss_Tomcat_Service.bat此文件的内容@echo offecho --------

echo Usage: %0 jdk_home tomcat_home (classic/hotspot/server)echo NOTE: You MAY NOT use spaces in the path names. If you know howecho to fix this, please tell me.echo JDK 1.4 does not come with hotpot server by default, you mustecho install this seperately if you wish to use it.echo Example: %0 ..\jdk ..\jboss30 hotspot

echo --------

if "%1" == "uninstall" goto uninstall

if "%1" == "-uninstall" goto uninstall

if "%1" == "" goto usage

if "%2" == "" goto usage

if "%3" == "" goto usage

if "%1" == "-help" goto usage

if "%1" == "-?" goto usage

if "%1" == "/?" goto usage

:install

JavaService.exe -install JBoss306 %1\jre\bin\%3\jvm.dll -Djava.class.path=%1\lib\tools.jar;%2\bin\run.jar -start org.jboss.Main -stop org.jboss.Main -method systemExit -out %2\bin\out.txt -current %2\bin goto eof

:uninstall

JavaService.exe -uninstall JBoss306

goto eof

:usage

echo -------- To Install JBoss 3.0.6 do

echo Usage: %0 jdk_home jboss_home (classic/hotspot/server)

echo NOTE: You MAY NOT use spaces in the path names. If you know how echo to fix this, please tell me.

echo JDK 1.4 does not come with hotpot server by default, you must echo install this seperately if you wish to use it.

echo Example: %0 ..\jdk ..\jboss30 hotspot

echo --------

echo -------- To Uninstall JBoss 3.0.6 do

echo Usage: %0 uninstall echo --------

goto eof

:eof

 

  e、 运行以下命令

 

Jboss_Tomcat_Service C:\j2sdk1.4.0_02 C:\jboss-3.0.6_tomcat-4.1.18 server

其中C:\j2sdk1.4.0_02是java安装的目录 C:\jboss-3.0.6_tomcat-4.1.18是Jboss安装的目录,server是不变的参数

 

  f、将会看到安装成功的命令,你到win2k或NT的Service中看我可以看Jboss306的服务,你可以正常的起动它。然后再查看各种网页(同windows安装相同)如果成功,到此恭喜你,你安装了JBoss服务器。

 

  (4)问题

 

  如果在在安装了服务,网页显示不正确。你需要多试几次,首先运行

Jboss_Tomcat_Service uninstall

 

  然后再运行

 

Jboss_Tomcat_Service C:\j2sdk1.4.0_02 C:\jboss-3.0.6_tomcat-4.1.18 server。

  1、下载例子源程序

  所有例子的源代码可以直接从 www.jboss.org进行下载。下载完后放在一个目录下。下载网址:http://www.jboss.org/docs/manual/files/documentation-example.zip

  1.1 建立 BEAN

  此节主要是建立一个简单的EJB,可以查看代码,这个“Interest”例子,是一个简单无状态的会话EJB。它的目的是根据说明的利息率,来对借的所有钱计算利息。实际上在整个包代码中只有一行功能。
  1.2 回顾EJBs

  在我们查看代码之前,我们先对EJB进行复习一下。在EJB最小类型,也必须有三个类:remote interface, home interface和bean实现类。

  remote interface是会把EJB中方法提供给外边世界,让外边的代码来进行调用,在这个例子中类名称是org.jboss.interest.Interrest。

  home interface是管理remote interface类的类。包括建立、删除等操作。在这个例子中类名称是org.jboss.interest.InterrestHome。

  bean实现类提供home interface和remote interface所有方法的实现。在这个例子中类名称是org.jboss.interest.InterrestBean。

  当然一个Bean可能还包括其他类,甚至其他包。但是必须有此三个类,其他类是在此三个类之上建立的。所有类被打包进一个JAR文件,此文件是用一个目录结构来反映出包的层次关系。在此例子中所有类都打包在 org.jboss.interest包中,所以他们需要在目录org/jboss/interest/下。

  在包含所有类的jar文件建立之前,必须有一个META-INF目录。此目录存放了部署描述符(通常叫“ejb-jar.xml”),和可选的其他XML文件。这些文件告诉服务器关于应用明确服务信息。对于JBoss 来讲,文件名必须叫“jboss.xml”。

  创建jar文件后部署到JBoss Server上。在客户端你需要一个jndi.properties文件,此文件告诉你的客户端程序从哪里初始化查找JNDI 命名服务。从这个服务,客户端将查找到Interest bean,并且返回bean的home interface。home interface用来得到bean的一个remote interface。它可以用远程接口来访问bean提供的商业方法。

  1.3 EJB类

  我们需要三个类:remote interface, home interface 和bean实现类。remote interface远程接口类,文件名Interest.java。代码如下:

package org.jboss.docs.interest;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
/**
This interface defines the `Remote' interface for the `Interest' EJB. Its
single method is the only method exposed to the outside world. The class
InterestBean implements the method.
*/
public interface Interest extends EJBObject
{
/** Calulates the compound interest on the sum `principle', with interest rate per period `rate' over `periods' time periods. This method also prints a message to standard output; this is picked up by the EJB server and logged. In this way we can demonstrate that the method is actually being executed on the server, rather than the client. */

public double calculateCompoundInterest(double principle, double rate, double periods) throws RemoteException;

}

  远程接口只有一个商业方法calculateCompoundInterest。Home interface 文件名InterestHome.java。代码如下:

package org.jboss.docs.interest;
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

/**
This interface defines the 'home' interface for the 'Interest' EJB.
*/
public interface InterestHome extends EJBHome
{
/** Creates an instance of the `InterestBean' class on the server, and returns a remote reference to an Interest interface on the client. */
Interest create() throws RemoteException, CreateException;
}

  最后我们给出bean实现类,文件名称:InterestBean.java。代码如下:

package org.jboss.docs.interest;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

/**
This class contains the implementation for the 'calculateCompoundInterest' method exposed by this Bean. It includes empty method bodies for the methods prescribe by the SessionBean interface; these don't need to do anything in this simple example. */public class InterestBean implements SessionBean
{
/** Calulates the compound interest on the sum `principle', with interest rate per period `rate' over `periods' time periods. This method also prints a message to standard output; this is picked up by the EJB server and logged. In this way we can demonstrate that the method is actually being executed on the server, rather than the client. */
public double calculateCompoundInterest(double principle, double rate, double periods)
{
System.out.println("Someone called `calculateCompoundInterest!'");
return principle * Math.pow(1+rate, periods) - principle;
}
/** Empty method body */
public void ejbCreate() {}
/** Every ejbCreate() method ALWAYS needs a corresponding ejbPostCreate() method with exactly the same parameter types. */
public void ejbPostCreate() {}
/** Empty method body */
public void ejbRemove() {} /** Empty method body */
public void ejbActivate() {} /** Empty method body */
public void ejbPassivate() {} /** Empty method body */
public void setSessionContext(SessionContext sc) {}

}

  注意大部分方法是空的。因为这些方法在SessionBean接口中说明,所以必须在InterestBean中存在,但在这个简单例子中,不需要具体内容。

  2、部署描述符

  当你编辑完类文件后,我们来看部署描述符。此文件告诉EJB Server是哪个类应该被唤醒bean、Home Interface 和remote Interface。如果一个包中有不止一个bean,它指明ejb同另外bean如何相和。在这
个简单例子中只有一个ejb,所以我们不用关心这方面问题。

  大部分商业EJB Server都提供图形化部署工具,来构造部署描述符,JBoss没有XML编辑器,但是它能够简单手工构造部署描述符。下面是Interest Bean部署描述符:

 


  部署描述符文件必须命名为“ejb-jar.xml”,并且必须放在目录META-INF下。一个大家容易犯的错误是目录名字,有的写成“META_INF”, “META~INF”或“meta-inf”所有这些都不能正常的工作。

  我们在server上部署一个应用程序,而不是一个ejb。在这个例子中我们的应用程序只有一个ejb。在部署描述符中<ejb-name> Interest</ejb-name>表明ejb的名称。JBoss缺省是把bean的home interface作为JNDI命名空间放在<ejb-name>中,除非你修改缺省值。实际上客户端应用程序不是必须使用这个名字的。开发者不用为 JNDI命名空间指明一个不同的名字而费心。然而一个由完整应用程序的产品包含多个beans,通常用一个和开发者说明不同的名字。所以会发现 “[application name]/[bean name]”等,关于这部分我们以后介绍。

  尽管部署描述符格式的文件ejb- jar.xml对所有ejb Server都是共有的。你可以从sun得到一个正确定义的DTD, 但是没有为一个特殊EJB Server指明每个必须要求。也没有说明如何从ejb-name影射到部署的JNDI名字,例如“[application name]/[bean name]”。通过JBoss提供一个缺省行为,来进行工作。这些工作来自于ejb-jar.xml。在高级配置的案例中,你必须定义JBoss说明行为, 此行为用jboss.xml部署描述符。在高级配置中我们会谈到jboss.xml描述符的详细信息的。

  这里我们仅配置 jboss.xml描述符的JNDI名字来用来访问Interest EJB home inrterface。通过缺省的JNDI名字用来访问EJB home inrterface, 需要同ejb-jar.xml的ejb-name相同。对于这个简单的例子,Interest bean通过JNDI初始化上下文(作为“Interest”)来定位。 我们想用“interest/Interest”使home interface 可以使用,所以我们必须用jboss.xml描述符来说明。在jboss.xml中,重新覆盖缺省的JNDI命名。为了重新编写缺省的行为,我们用ejb -jar.xml中的ejb-name元素值作为bean home接口的JNDI命名,必须说明jndi命名,来写jboss.xml描述符如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>Interest</ejb-name>
<jndi-name>interest/Interest</jndi-name>
</session>
</enterprise-beans>
</jboss>


  这个文件说明调用的Interest BEAN被绑定在interest/Interest的JNDI名称下。我们建立的标准ejb-jar.xml部署描述符同JBoss说明 jboss.xml共同设置Interest EJB home接口的JNDI名称为“interest/Interest”。我们现在有了EJB类,这些类是建立ejb 文件包必须的文件。

  3、打包和部署BEAN

  jar包是建立一个JAR文件,该文件包含EJB类文件和部署描述符。在下载的例子可能和你设置环
境不同,所以需要修改examples\build\build.xml的内容。关于各个ant方面的内容,我会在Ant文档中介绍给大家。关于如何修改,下面我一步步地来告诉大家。以下是windows平台的。至于Unix/Lunix平台基本相似,这里就不在叙述了。

  1) 在修改之前,比首先设定JBOSS_DIST环境变量,指定到你安装的Jboss的目录。我安装在C:\jboss-3.0.6_tomcat-4.1.18, 所以 JBOSS_DIST设定为C:\jboss-3.0.6_tomcat-4.1.18。

  2) 你是否安装了tomcat或jetty等web服务器。如果你没有安装,建议你安装jboss-3.0.6_tomcat-4.1.18, JBoss和tomcat直接结合在一起啦,不需要再单独安装,当然也可以安装jboss-jetty( JBoss和jetty直接结合在一起)。取决你喜欢什么web服务器。

  3) 完成上面两步后,我们来讨论修改examples\build\build.xml文件。在原有的文件中的部分代码:

 


  由于此代码例子是jboss2.2中的所以对于我们不能适应,在此基础上我们来进行改动。在改动之前,来说明一下为什么改动,让大家清楚改动原因,不是一团雾水。

<available property="servlet.jar" value="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar" file="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar"/>….

  此部分说明你运用的web服务器是什么,根据你使用的web服务器来设置servlet.jar。 由于我使用的是jboss-tomcat.。

<path id="base.path_24"> … </path>说明客户端要的CLASSPATH包。

  修改以后的部分文件:

 

<target name="validate-servlet">
<!-- Override with your web server servlet jar location.
The default assumes that JBOSS_DIST points to a
JBoss/Tomcat bundle distribution
-->
<available property="servlet.jar" value="${env.JBOSS_DIST}/tomcat-4.1.x/common/lib/servlet.jar" file="${env.JBOSS_DIST}/tomcat-4.1.x/common/lib/servlet.jar"/>
<available property="servlet.jar" value="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar" file="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar"/>
<available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar"/>
<available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.TOMCAT_HOME}/lib/servlet.jar"/>
<property name="servlet.jar" value="COULD_NOT_FIND_SERVLET_JAR"/>
<path id="base.path_22">
<pathelement location="${jboss.dist}/client/ejb.jar"/>
<pathelement location="${jboss.dist}/client/jaas.jar"/>
<pathelement location="${jboss.dist}/client/jbosssx-client.jar"/>
<pathelement location="${jboss.dist}/client/jboss-client.jar"/>
<pathelement location="${jboss.dist}/client/jnp-client.jar"/>
<pathelement location="${servlet.jar}"/>
</path>
<path id="base.path_306">
<pathelement location="${jboss.dist}/client/jboss-j2ee.jar"/>
<pathelement location="${jboss.dist}/client/jboss-jaas.jar"/>
<pathelement location="${jboss.dist}/client/jbosssx-client.jar"/>
<pathelement location="${jboss.dist}/client/jboss-client.jar"/>
<pathelement location="${jboss.dist}/client/jnp-client.jar"/>
<pathelement location="${jboss.dist}/client/jbossall-client.jar"/>
<pathelement location="${jboss.dist}/client/log4j.jar"/>
<pathelement location="${servlet.jar}"/>
</path>
</target>
<target name="validate-jboss" depends="validate-servlet">
<available property="classpath_id" value="base.path_22" file="${jboss.dist}/client/ejb.jar" />
<available property="classpath_id" value="base.path_306" file="${jboss.dist}/client/jboss-j2ee.jar" />
</target>


  4)修改完后存盘。然后到exaples\build目录下运行以下命令:

ant intro-interest-jar

  如果成功会提示 : BUILD SUCCESSFUL 。

  在编译EJB 类文件,建立ejb-jar文件时,如果有一个java.lang.NoClassDefFoundError异常产生,你需要检查你的classpath。修改<path id="base.path_306">中的内容。

  5)完成后你可以查看interest.jar文件中内容:

  jar –tvf interest.jar为了把bean部署到server上,必须拷贝interest.jar文件到JBOSS_DIST/server/default/deploy目录下。服务器自己会发现发生变化的文件,并重新部署它。

  6)当JBoss server运行时,通过在examlpes\build目录下运行ant intro-interest-deploy来部署jar。在你部署期间,你会看到在server控制台的一些信息。

  7)如果你发现部署失败的信息,通常是部署描述符ejb-jar.xml文件结构坏了或丢失或在错误的目录下。

  8)如果在Server上部署完后,我们来编写一个简单客户端来测试它是否正常工作。

  4、 编码和编译客户端

  单独一个ejb是不能用,我们至少需要一个简单客户端来用它的服务。一个EJB可以被其他的EJB,普通的JavaBean,一个JSP page,一个applet程序或是独立的应用程序调用。在这个例子中。我们编写一个简单的应用程序。这个应用程序将会建立Interest类的一个对象。并且执行它的方法。当部署完bean后,server会绑定EJB home 接口到interest/Interest的JNDI名字下,并输出此home 接口,能通过RMI被调用。客户端代码如下:

 


  客户端在JNDI命名 “interest/Interest”下查找InterestHome接口。如果你提供了一个正确的jboss.xml文件,Bean home接口将会绑定到这个名字。否则,JNDI的名字是“Interest”。为了连接JBoss JNDI,必须建立一个初始化上下文,该上下文是根据在客户端的classpath路径下jndi.properties来的。这个 jndi.property文件我们放在了examples\resources\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


  指定了InitialContextFactory (初始化上下文工厂),url,和工厂对象的包。在这里url是“localhost”,或运行JBoss的主机名(IP),用的缺省端口是1099。为了不同RMI协议互相兼容,通过“narrow”方法来确保“ref”对象能转换为“InterestHome”对象。客户端不需要必须和EJB类在同一个包中。所以它必须import ejb claess类。

  为了能运行Ant命令。我修改了examples\org\jboss\docs\interest\build.xml文件,原文件的部分内容:

 

<target name="deploy-ejb-jar" depends="ejb-jar">
<copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/deploy" />
</target>
<target name="deploy-ear" depends="ear">
<copy file="${build.interest.dir}/interest.ear" todir="${jboss.dist}/deploy" />
</target>


  修改后为:

 

<target name="deploy-ejb-jar" depends="ejb-jar">
<copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/server/default/deploy" />
</target>
<target name="deploy-ear" depends="ear">
<copy file="${build.interest.dir}/interest.ear" todir="${jboss.dist}/server/default/deploy" />
</target>


  修改完后保存。编译和运行InterestClient,通过以下命令:

ant intro-interest-client会出现正确的结果。

  5、补充说明

  各个jar文件:

  1) jboss-j2ee.jar :是标准的javax.ejb.* 包括EJB2.0接口和类。

  2) jboss-jaas.jar :是java鉴定和授权服务安全类。

  3) jbosssx-client.jar :是JbossSX安全扩展客户端类。

  4) jboss-client.jar :是Jboss EJB容器代理和stub客户端类。

  5) jnp-client.jar :是JBoss JNDI提供者客户端类。

  现在隐藏代码,编译和部署EJB, 运行简单客户端进行测试。

  6、 结论

  最后来进行一个总结。

  Server:

  为每个EJB(包括有、无状态的Session,或实体Bean),都需要三个文件: bean实现类, remote接口类,home接口类。这些类和一个或多个部署描述符(ejb-jar.xml, jboss.xml等),这些描述符必须在META-INF目录下,一起打包进jar文件。为部署这个jar文件,你只需要拷贝到jboss\ server\default\deploy\下。

  Client:

  1)从JNDI服务,查找bean的home 接口;

  2)从home接口,建立一个新的bean或得到一个已经存在bean;

  3)用得到的remote接口来访问服务器上bean实现类中商业方法。

  在客户端查找home 接口之前,客户端必须知道如何从JNDI来定位。因此我们提供了一个jndi.properties文件。这个文件和一些jboss\clientx下的jar,必须包含到CLASSPATH中,才能使客户端运行。

1、介绍

本章介绍在Jboss中使用Java Messageing Service (JMS). 不是JMS指南,而是JBoss和JMS如何一起使用,如果你想看JMS的介绍,请参考 JMS Specification 或 JMS turorial.

最近随着JBoss版本不断更新,对JMS支持越来越成熟,也造成JBoss各个版本之间的不同。在这里我主要介绍JBoss3.0.X版本。

本章给出的例子比较简单,并指出了如何使用JMS的原理。所有的例子可以通过ant build file 来建立。

为了能建立和运行此例子。我们使用两种方式来进行:一是使用Ant命令,二是使用JAR和JAVA基本命令。必须有下面的环境变量:

w JAVA_HOME 安装JDK1.4的目录。

w JBOSS_DIST 安装JBoss的目录。

你必须安装JDK, 如果使用Ant必须安装 Ant。可以参考我前面文档的介绍。

2、概述

1) 什么是JMS

JMS是Java API, 允许应用程序来建立、接收和读取消息。程序依靠这些API, 在运行时需要一个JMS实现接口,来提供管理和控制,这被称为JMS provider, 现在有几种不同的JMS Provider; 在JBoss中的叫做JbossMQ。

2) JMS 和J2EE

JMS是在EJB和J2EE框架开发之前进行开发的,所以在JMS说明书中没有涉及到EJB或J2EE。

EJB 和J2EE第一代版本中也没有涉及到JMS,一直到EJB1.1,在生成一个可用Beand的容器provider中JMS也不是必须的API。在 J2EE1.2中JMS接口是必需的情况,但并不是非得要包含一个JMS Provider;在EJB2.0和J2EE1.3中又进行改变,应用服务器包含了一个JMS Provider,自从J2EE1。3需要EJB2.0,增加了以下两个JMS特性:

w 一种新Bean类型定义, 也就是消息驱动Beam (MDB), 这种bean做为JMS消息监听者,可以异步地处理JMS消息。

w JMS处理作为资源,来自一个Bean 的JMD 发布(发送)必须能和其他bean的全局事务环境共享。这个需要把JMS认为是一个容器管理资源,象JDBC的连接。

3) JMS 和JBoss

JBoss从2.0版本以后都支持JMS。 在2.1中增加了MDB,从2.4版本开始JMS作为一个事务资源。

JBoss中JMS的体系结构如下:

w JMS Provider, 叫做JbossMQ 。 是JBoss实现JMS 1.0.2规范的一部分,包括可选部分,象ASF(Application Service Facvility)。 JbossMQ处理和普遍JMS一样:建立 queues (队列)或topic(标题),持久性等。

w MDB (Message Driven Beans),

w 资源适配器。

 

3、JMS Provider

JBoss 有它自己的JMS Provider 叫做JbossMQ。 适合与JMS 1.0.2 的JMS Provider,并且能用在所有平常的JMS程序中。为了清楚在JBoss中JMS是如何工作的,首先要清楚在JMS中涉及到的概念和术语,最好的办法是阅读JMS规范,下面给出了简单的JMS介绍。

1) JMS的简单介绍

当你发送一个消息,你不能直接发送到对此消息感兴趣的接受者。而是你发送到一个目的地。对此消息感兴趣的接受者必须连接到目的地,得到此消息或在目的地设置订阅。

在JMS中有两种域:topics 和queues 。

w 一个消息发送到一个topics ,可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher, 消息接受者叫做subscriber。

w queue 是另外一种方式,仅仅允许一个消息传送给一个客户。一个发送者将消息放在消息队列中,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能在得到它。

为了能发送和接收消息,必须得到一个JMS连接。该连接是使用JMS Provider得到连接的,在得到连接之后,建立一个会话(Session)。然后再建立publisher/sender 来发送消息或subscriber/receiver来接收消息。

运行时,如果使用topic 那么publisher 或subscriber 通过一个topic来关联,如果使用queue ,则sender 或receiver通过queue来关联起来。

通常,在JMS框架中运转的方法如下:

(1) 得到一个JNDI初始化上下文(Context);

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);

(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);

(4) 通过连接来建立一个会话(Session);

(5) 查找目的地(Topic/ Queue);

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/ QueueReceiver).

为了得到一个连接和得到一个目的地(用来关联publisher/sender 或subscriber/receiver),必须用provider-specific参数。

通过 JNDI来查找相应的连接工厂或目的地,JNDI适合于任何JMS Provider。但是查找用的名字是provider使用的。因此,在你使用的JMS Provider(其中包括JBossMQ),必须学会如何进行指定。JMS Provider中的任何设置,象连接特性,用到目的地等,在用到的Provider都有明确描述。

2) 配置

当使用一个JMS Provider时,有三个Provider-specific因素:

w 得到一个JNDI初始化上下文

w 用到的连接工厂的名字。

w 对目的地的管理和命名协定。

JBoss同它的JNDI一起执行。为了简单的JMS client, 配置和查找初始化上下文,同实现其他J2EE客户端一样。

JMS-specific 来约束JBoss 的JMS provider (JBossMQ)。JbossMQ是通过xml 文件jbossmq-service.xml进行配置的,该文件放在在server\default\deploy下。

在xml文件中最基本的三件事情:

w 增加一个新的目的地

w 配置用户

w 获得可用连接工厂的名字。

(1) 增加新的目的地

w 在目的地的xml文件在jboss 3.x中是jbossmq-destinations-service.xml(server/../deploy)。在文件中已经存在几个缺省的目的地,所以你比较容易明白怎样增加到文件中。在例子中你需要一个topic目的地 spool,所以增加下面的语句到jbossmq-destinations-service.xml中。这种方式是长久存在的,不随着JBoss服务器关闭而消失。

<mbean style="TEXT-INDENT: 2em" code="org.jboss.mq.server.jmx.Topic"></mbean>name="jboss.mq.destination:service=Topic,name=spool">

<depends optional-attribute-name="DestinationManager"></depends>jboss.mq:service=DestinationManager

 

w 另外一种方法是可以通过JMX HTML管理界面。通过http://localhost:8080/jmx-console 来访问。在jboss.mq 下查找service=DestinationManager 的连接。然后在createTopic()或createQueue()来建立,这种方法建立的目的地是临时性的,随着服务器开始存在,当当JBoss 服务器重新启动时,动态建立的目的地将会不存在。在JbossMQ中所有目的地都有一个目的地类型的前缀。对于topic前缀是topic ,对于queues前缀是queue。例如查找一个testTopic目的地,需要查找名字为“topic/testTopic”。

在此种方法中有createTopic()或createQueue()分别有两种方法:一是有两个参数,二是有一个参数的。两个参数分别是:建立的目的地名称和 JNDI名称。一个参数的只是目的地名称,对于JNDI名称默认是:[目的地类型(topic/queue) ]/目的地名称。

在这里我们使用的是第一种方法。直接修改jbossmq-destinations-service.xml文件。

(2) 管理用户

在JMS中可能关联一个连接和一个用户,不幸的是没有明确的方法来限制访问JbossMQ或访问特殊的目的地到一个给定的用户。为了给大部分角色,在JbossMQ中不需要建立用户,除非想有一个持久topic订阅者。在这个例子中,用户是必须的。

用户可以直接在文件jbossmq-state.xml(server/../conf)中添加。同样也可以使用JMX HTML管理界面来增加(jboss.mq->service=StateManager->addUser())。

<user></user>

<name></name>jacky

<password></password> jacky

<id></id>DurableSubscriberExample

>

 

(3) 连接工厂

JBossMQ 包括为topic和queue几个不同的连接工厂,每个连接工厂有自己特性。当通过JNDI来查找一个连接工厂时,需要知道此连接工厂的名称。所有可用连接工厂和它们的属性,名称都会在文件jbossmq-service.xml中。

有三种类型连接工厂,依赖的通讯协议如下:

OIL

快速双向scoket通讯协议。它是缺省的。

UIL

超过一个socket协议,可以使用在通过防火墙访问,或者当客户端不能正确的查找到服务器的IP地址。

RMI

最早的协议,是稳定的,但是比较慢。

JVM

在JBoss 2.4之后增加的一个新的连接工厂类型。不需要用socket,当客户端和JbossMQ使用同样虚拟机时,可以使用。

在JBoss2.4.1以后版本中,对于topic- 和 queue-目的地,连接工厂使用同样的名字。下表列出了在JBoss中JMS连接工厂:

目的地类型 JNDI名字 连接工厂类型

Topic/Queue java:/ConnectionFactory JVM

Topic/Queue java:/XAConnectionFactory JVM支持XA事务

Topic/Queue RMIConnectionFactory RMI

Topic/Queue RMIXAConnectionFactory RMI支持XA事务

Topic/Queue ConnectionFactory OIL

Topic/Queue XAConnectionFactory OIL支持XA事务

Topic/Queue UILConnectionFactory UIL

Topic/Queue UILXAConnectionFactory UIL支持XA事务

 

3) JBoss中高级JMS配置

在上边段落主要描述了和JbossMQ一起实行的基本配置工作。在本段来描述JMS其他配置。

(1) JMS持久性管理

JMS持久性管理(PM)负责存储消息,并且将消息标记为持久,如果服务器发生故障时,能保证消息不会丢失,并允许恢复持久性消息。持久性JMS消息可以使用不同的方法来完成。每个方法有自己优点和缺陷:

PM 名字 优点 缺点

File 比较稳定 速度慢

Rollinglogged 速度比较快 此方法比较新,有些地方需要完善

JDBC 对于稳定性和可量测性比较好 必须有JDBC

Logged 速度快 Log files grow without bound, memory management problems during recovery

在JBoss中缺省的持久性消息管理是File持久性管理。可以改变它,但必须对于一个JMS

Server有且仅有一个持久性管理配置。所以你在JBoss管理界面的jboss.mq – >

service=PersistenceManager 只是看到一个。

持久性管理的配置文件是jbossmq-service.xml。在server\..\deploy下。

为了让大家了解持久性管理的各种方法,我下面来逐个介绍如何配置。

w File持久性管理

File持久性管理的概念就是为每一个持久性消息建立一个文件。消息持久性方法不是全部都能使用,但它是比较稳定的。

File持久性管理在JBoss发布时,作为一个缺省的持久性管理。如果你打开jbossmq-service.xml文件,你会看到下面的XML:

<mbean style="TEXT-INDENT: 2em" code="org.jboss.mq.pm.file.PersistenceManager"></mbean>name="jboss.mq:service=PersistenceManager">

<attribute name="DataDirectory"></attribute>db/jbossmq/file

<depends optional-attribute-name="MessageCache"></depends>jboss.mq:service=MessageCache

 

当设置Mbean配置时,File持久性管理允许你指定下面的属性:

DataDircetory 是存放持久性消息的路径,会把生成的数据文件放在此目录下。

 

w 设置Rollinglogged持久性管理

Rollinglogged持久性管理是比较新的一种持久性消息管理方法,因为它使用日志文件来持续多个消息,所以当建立一个文件时,不需要许多的I/O。

定义Rollinglogged持久性管理:

<mbean style="TEXT-INDENT: 2em" code="org.jboss.mq.pm.rollinglogged.PersistenceManager"></mbean>name="jboss.mq:service=PersistenceManager">

<attribute name="DataDirectory"></attribute>db/jbossmq/file

<depends optional-attribute-name="MessageCache"></depends>jboss.mq:service=MessageCache

 

Rollinglogged持久性管理中DataDirctory 存放持久性消息的路径,会把生成的数据文件放在此目录下。

 

w 设置JDBC持久性管理

JDBC持久性管理使用数据库表来存储消息。需要一个JBoss配置的数据源来访问数据库。具体内容参考jbossmq-service.xml文件中的内容。

w 设置Logged持久性管理

Logged持久性管理是比较早的一个,在JBoss2.4.1以后版本中不在建议使用。现在有其他更好的办法。

4、举例说明

当我们清楚了以后内容后,现在我们来用JBoss实现一个例子来加深对JBoss和JMS的了解。

在上面叙述中,我们知道明确使用JMS provider有三个基本的事情要做:配置JNDI初始化上下文,连接工厂的名字和使用目的地的名字。

当编写产品的最好的事情是不受provider-specific 影响,使代码能在不同的JMS provider之间容易移植。在此这个例子没有聚焦在开发产品上,而是解释如何使用JbossMQ来工作。

1) 初始化上下文

w 配置JNDI的一个方法是通过属性文件jndi.properties。在这个文件中使用正确的值,并且把它所在的路径包含到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

把该文件放置的路径成为你的classpath的一部分。如果你使用这种方法,在初始化上下文时,代码比较简单: Context context = new IntialContext();1

w 在某些情景下,可能需要手工配置JNDI;例如当运行的类文件中环境已经配置了一个初始化上下文,但不是你想用的上下文时,需要手工来配置一个上下文。设置在哈希表中的几

分享到:
评论

相关推荐

    jboss开发技术文档

    《JBoss开发技术文档》是针对企业级应用服务器JBoss的详细指南,旨在帮助开发者深入理解和熟练运用这一开源Java EE应用服务器。本文档分为两大主要部分:JBoss入门和JBoss的配置,涵盖了从安装、启动到高级特性的...

    jboss 中文开发文档

    ### JBoss 中文开发文档知识点总结 #### 一、引言 JBoss 是一款非常流行的开源Java应用服务器,被广泛应用于各种规模的企业级项目中。本文档旨在为开发者提供一个全面且深入的学习资源,帮助他们从零开始学习并掌握...

    jboss as7 文档

    4. **更多资源**:链接到其他相关文档、论坛和技术支持信息。 5. **管理指南**:深入讲解JBoss AS7的管理接口、概念以及具体管理任务。 #### 二、管理员指南详解 ##### 5.1 目标受众与先决条件 - **目标受众**:...

    jboss相关技术文档

    总结来说,这些文档提供了深入理解JBoss技术栈的关键步骤,无论你是新手还是经验丰富的开发者,都能从中受益。通过实践这些教程,你可以熟练掌握JBoss的部署、配置和管理,从而更好地利用其在企业级Java应用中的强大...

    jboss seam 中文文档

    ### JBoss Seam 中文文档知识点概述 #### 一、JBoss Seam 简介 JBoss Seam 是一款基于 Java EE 的应用开发框架,它通过提供一套丰富的组件模型和灵活的应用结构,极大地简化了企业级应用的开发过程。Seam 结合了 ...

    jboss seam 中文文档集合

    **JBoss Seam 中文文档集合概述** JBoss Seam 是一个开源的应用框架,它结合了JavaServer Faces (JSF)、Java Persistence API (JPA)、Enterprise JavaBeans (EJB) 3.0 和其他Java EE组件,旨在简化企业级开发。这个...

    jboss tools ESB技术文档

    通过以上知识点的详细说明,我们可以了解到JBoss ESB技术文档涵盖了从安装、配置到使用的各个方面,为开发者提供了全面的技术指导和支持。这不仅有助于加快ESB项目的开发进度,还能有效降低因配置错误导致的问题发生...

    jboss-4.0.5.GA.zip

    12. **社区支持**:作为开源项目,JBoss拥有活跃的社区,提供了大量的文档、示例和问题解答,方便用户学习和解决问题。 在使用"jboss-4.0.5.GA.zip"这个压缩包时,用户需要先将其解压,然后按照官方文档或者社区...

    jboss7 文档

    此外,Red Hat提供了商业级别的技术支持和服务,包括电话、邮件支持、紧急问题响应等,确保企业级应用的稳定运行。 综上所述,JBoss AS 7不仅是一个功能强大的应用服务器,也是一个高度可配置、易于管理的平台。...

    jboss4开发指南

    - **J2EE1.4认证**:JBoss4.0.x获得了J2EE1.4认证,意味着它支持最新的Java企业级标准,为企业提供更强大的技术支持。 - **应用场景**:在企业级应用、开发者社区以及开源社区中都有广泛的应用。 #### 二、安装与...

    Jboss4.2.2.GA英文文档

    总结,JBoss AS 4.2.2 GA是一个功能丰富的应用服务器,其英文文档为开发者提供了详尽的技术指导,涵盖了从基础概念到高级特性的所有内容,有助于提升开发者的技能和效率。通过深入学习和实践,开发者能够充分利用...

    JBoss中文文档

    - **JBoss中的Web服务支持**:JBoss支持多种Web服务标准和技术,如SOAP、WSDL等,可用于构建和部署Web服务应用。 以上是根据“JBoss中文文档”的标题、描述、标签及部分内容总结出来的相关知识点。这些知识点覆盖了...

    jboss-5.0.0.GA

    JBoss AS 5.0是基于Java EE 5规范的,支持包括EJB 3.0、JSF 1.2、JPA 1.0、JMS 1.1、Servlet 2.5和JSP 2.1等在内的多种Java企业级技术。它旨在提供一个高效、可扩展且易于管理的平台,用于部署和运行企业级Java应用...

    JBoss Group - JBoss All Docs Subscription

    【JBoss Group - JBoss All Docs Subscription】是一个全面的文档订阅服务,专为那些希望深入理解和精通JBoss中间件技术的IT专业人士设计。这个订阅涵盖了JBoss产品线的各种文档,帮助用户掌握JBoss的安装、配置、...

    JBOSS中文文档

    4. **应用部署**:JBoss 支持多种方式部署应用程序,如WAR、EAR和JAR格式的文件。文档将解析如何打包应用,并通过控制台或命令行进行部署。 5. **Web 服务**:讲解如何在JBoss上开发和部署Servlet、JSP应用,以及...

    jboss4.3 起步指南

    - **GitHub仓库**:关注JBoss项目在GitHub上的仓库,获取最新的代码更新和技术动态。 通过以上内容的学习与实践,相信开发者能够更好地掌握JBoss AS 4.3的使用技巧,为构建高效稳定的企业级应用打下坚实的基础。

    JBoss中文文档.pdf

    - **主目录**:JBoss 安装目录通常包含多个子目录,例如 `bin`(用于存放启动脚本)、`docs`(文档)、`lib`(库文件)、`server`(配置文件)等。 - **服务器配置**: - 配置文件位于 `server/&lt;profile&gt;/deploy` ...

Global site tag (gtag.js) - Google Analytics