`

转: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;例如当运行的类文件中环境已经配置了一个初始化上下文,但不是你想用的上下文时,需要手工来配置一个上下文。设置在哈希表中的几

分享到:
评论

相关推荐

    文档管理系统简单介绍(企业版)

    Web容器:系统支持JBoss、Tomcat等多种Web容器,可以方便地在Web容器之间进行移植。系统默认配备的Web容器为Tomcat。 操作系统:系统支持Windows、Linux/Unix等操作系统平台,可以方便地在操作系统平台之间进行移植...

    使用Eclipse开发J2EE应用—集成Eclipse,Lomboz和JBoss

     JBoss是一个开放源码、功能强大的Java应用服务器,也是目前最受Java开发者欢迎的Java应用服务器,被Java World的编辑们评为2002年的最佳应用服务器。2003年到目前为止的下载量已经超过了一百五十万次。

    MCMS内容管理系统 v4.5.2.zip

    技术支持:提永久升级服务技术交流群,不定期会升级系统,开发可以关注后台的更新板块; MCMS内容管理系统开发框及语言 铭飞MCMS(铭飞内容管理系统)是一款支持不同平台、不同终端并且支持多站点的内容管理系统, ·...

    KASS功能介绍V3.0.2

    Web容器:KASS支持Tomcat, JBoss, WebSphere等Web容器,用户可以根据自己的实际需要选用合适的Web容器。 负载均衡:KASS可以通过对数据库、 Web容器等进行集群的方式来均衡KASS服务器的负载,以提高服务器的能力。...

    zanata-platform:Zanata是一个基于Web的系统,翻译人员可以使用Web浏览器在线翻译文档和软件

    它是用Java编写的,并使用了JBoss EAP,CDI,GWT,Hibernate和REST API等现代Web技术。 当前,它支持通过PO文件以及许多其他格式来翻译DocBook / Publican文档。 可以使用Maven插件或命令行客户端将项目上传到...

    javapms门户网站源码

    在应用服务器平台兼容性方面,系统支持跨应用服务器,如Tomcat、Weblogic、Webspere、JBoss等应用服务器,很好的满足了各层次用户的需求。 在浏览器兼容性方面,目前多种浏览器并存,使用非IE浏览器的用户越来越多,...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    Hibernate v3.2中文参考手册

    ) &lt;br&gt;商业开发、产品支持和Hibernate培训可以通过JBoss Inc.获得。(请查阅:http://www.hibernate.org/SupportTraining/)。 Hibernate是一个专业的开放源代码项目(Professional Open Source project),也是...

    Hibernate3.2官方中文参考手册

    ) &lt;br&gt;商业开发、产品支持和Hibernate培训可以通过JBoss Inc.获得。(请查阅:http://www.hibernate.org/SupportTraining/)。 Hibernate是一个专业的开放源代码项目(Professional Open Source project),也是...

    Jetty中文手册

    集群技术 JBoss Infinispan (from Redhat) Gigaspaces Terracotta WADI 基于数据库的Session集群配置教程 基于Terracota的Session集群配置教程 Web Frameworks DWR MyFaces JSF Reference Implementation Jakarta ...

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    dom4j 优秀的JavaXML API 主要用于解析XML文档 poi组件 主要用于读取以及写入Microsoft Office格式档案 JSR 303 为实体验证定义了一个元数据模型和API 前端技术选型 JS框架:jQuery 1.8 CSS框架:Twitter Bootstrap ...

    Oscache-入门教程.doc

    Cache是一种用于提高系统...OSCache是当前运用最广的缓存方案,JBoss,Hibernate,Spring等都对其有支持。 Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明。

    测试培训教材

    QC支持的应用服务器:Jboss、WebLogic、WebSphere QC支持的数据库:Oracle、SQLServer QC支持的操作系统:Windows、Linux、Solaris 支持群集: 服务器端硬件和数据库要求: Windows: Linux: Solaris: ...

    FreeMarker模板引擎-其他

    你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰 4、为Web准备 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构 能够集成...

    Activiti6.0教程例子下载

    学习过Activiti的朋友都知道,Activiti的创始人也就是JBPM(也是一个优秀的BPM引擎)的创始人,从Jboss离职后开发了一个新的BPM引擎:Activiti。所以,Activiti有很多地方都有JBPM的影子。所以,据说学习过JBPM的...

    使用Eclipse开发CMP

    北京火龙果软件工程技术中心内容摘要:Eclipse作为目前成功的开源IDE之一受众多Java开发人员的喜爱,但是其内部并不直接支持EJB的开发一直为广大开发人员所诟病,并且大大增加了EJB初学者使用Eclipse开发EJB的难度;...

    开源软件之道(中文高清版)

    4.3 管理维护和技术支持成本 4.4 风险控制成本 第2篇 使用开源软件 第5章 正确使用开源软件 5.1 管理体制 5.2 法律风险 5.2.1 法律因素之著作权 5.2.2 法律因素之许可证 5.2.3 法律因素之专利 5.2.4 问题解析 5.2.5...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

Global site tag (gtag.js) - Google Analytics