2003年2月28日星期五
前言
JBOSS推出3.0.4版本其实已经很久很久啦,可是呢,网上关于它的介绍就少得可怜,而且仅有的几篇介绍都并不完全正确,很多甚至是直接拷贝JBOSS2.4.4的相关内容。那些抄袭者没有想到,从JBOSS2.4.4到JBOSS3.0.4之间有很大的飞跃,甚至目录结构也不相同了,相关配置更不用多说,他们那些拷贝来的作品根本不能正确指导人们学习JBOSS。
为了学习JBOSS,我想大多数人可能都要从JBOSS.org/">http://www.JBOSS.org那里下载其本身的文档,如3.x版本就有文档JBOSS.3.0QuickStart.Draft3.pdf来进行入门指导。但是令人万万没有想到的是,JBOSS.3.0QuickStart.Draft3.pdf文档中甚至也有错误的地方,完全按照它的指引,大家将会走弯路的。
因此,结合我最近学习JBOSS3.0.4的经验,根据实际应用情况,总结出JBOSS3.0.4配置及使用初步文档,供大家参考和讨论。
前提
首先,你必须安装了JDK,版本为1.3以上,我使用的是1.4版本。并在CLASSPATH中设置JAVA_HOME环境变量为JDK安装目录。确保在你的机器上可以运行JAVA程序。
安装及运行JBOSS3.0.4
在JBOSS自己的网站JBOSS.org/">http://www.JBOSS.org下载JBOSS3.0.4,有JBOSS-3.0.4.zip和JBOSS-3.0.4_tomcat-4.1.12.zip。后者是JBOSS和tomcat整合到一起的版本,这里主要介绍前者,既单独的JBOSS3.0.4。
JBOSS的运行很简单。将JBOSS-3.0.4.zip解压到本地硬盘的一个目录中。会有以下几个目录生成:
bin
放置JBOSS启动和停止的可执行脚本文件
docs
lib
放置JBOSS所需要的部分jar包文件
client
放置EJB客户端运行时所需要的jar包
server
放置各启动类型的服务器端EJB配置所需要的文件等。
JBOSS3.0.4有三种启动类型,分别为all, default, minimal。如在windows平台下启动JBOSS,可直接启动bin目录下的run.bat既可。此时默认为以default形式启动,如需其它启动方式,则需要参数设置,如想以all模式启动,则运行run.bat –c all命令。至于三种启动模式的区别,无非就是启动的服务多少不同,具体请参照JBOSS.3.0QuickStart.Draft3.pdf文档。该文档也有设置JBOSS启动为windows服务的一段,也可以参照,不过我按照它的做法尝试了一下,发现居然JBOSS的服务会占据90%以上的CPU资源(当时我用的是赛扬233,脸红中……)。
正如大家所看到的,JBOSS启动就这么简单,而且也不需要按照自己的机器额外进行其他配置。到这一步,大家都很爽吧。OK,让我们继续
查看JBOSS端口
这本来不应单独成为一章,但是,网上各资料和JBOSS.3.0QuickStart.Draft3.pdf 中都在这一部分对使用者进行了误导,我想在这里我有必要进行澄清。
启动JBOSS后,我们可以查看8080端口,在浏览器地址栏中键入http://localhost:8080,我们会发现一个错误页面,内容为“HTTP ERROR: 404 / Not Found RequestURI=/”这是正常的,因为你根本就没有页面可以显示。
在按照网上资料和JBOSS.3.0QuickStart.Draft3.pdf的要求查看8082端口时,我们就会发现,根本和资料中讲述不一致了。JBOSS.3.0QuickStart.Draft3.pdf中的原文是这样的:“To check if JBOSS is running please open a browser and enter http://localhost:8082 which will list all JBOSS components running.”但是,我们将会出现一个错误页面!并不是象它所说的会列出所有运行的JBOSS组件。经过查找,发现其实应该是http://localhost:8080/jmx-console 。此点一定注意,否则会打击初学者学习JBOSS的兴趣的。我们通过这个页面进行对JBOSS的各服务的配置和管理。
我们再查看http://localhost:8083 会出现一个没有错误的空白页,正常,应该是这样。
我们再查看http://localhost:1099 会出现一大堆乱字符,当然,里面包含了你的IP地址等等类似的信息。1099是jnp协议监听名字服务的缺省端口,RMI的缺省端口也是一样的。在JNDI中,我们需要用到此端口。
OK,基本端口信息就这些。
EJB文件的编写
EJB的结构不是我们讨论的内容,下面只是列出它的程序代码,是一个无状态的sessionBean。在这里我用的是ejb2.1的JAR。
Remote接口文件:Example.java
package examples;
import javax.ejb.EJBObject;
public interface Example extends EJBObject {
public String example() throws java.rmi.RemoteException;
}
Home接口文件:ExampleHome.java
package examples;
import javax.ejb.EJBHome;
public interface ExampleHome extends EJBHome {
Example create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}
Local接口文件:ExampleLocal.java
package examples;
import javax.ejb.EJBLocalObject;
public interface ExampleLocal extends EJBLocalObject {
public String example();
}
LocalHome接口文件:ExampleLocalHome.java
package examples;
import javax.ejb.EJBLocalHome;
public interface ExampleLocalHome extends EJBLocalHome {
ExampleLocal create() throws javax.ejb.CreateException;
}
Bean文件:ExampleBean.java
package examples;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class ExampleBean implements SessionBean {
public ExampleBean() {
super();
}
public void setSessionContext(SessionContext arg0)
throws EJBException, RemoteException {
System.out.println("setSessionContext");
}
public void ejbCreate()
{
System.out.println("ejbCreate");
}
public void ejbRemove() throws EJBException, RemoteException {
System.out.println("ejbRemove");
}
public void ejbActivate() throws EJBException, RemoteException {
System.out.println("ejbActivate");
}
public void ejbPassivate() throws EJBException, RemoteException {
System.out.println("ejbPassivate");
}
public String example()
{
System.out.println("example()");
return "Just a simple example!";
}
}
客户端调用程序文件:ExampleClient.java
package examples;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import java.util.Properties;
public class ExampleClient {
public ExampleClient() {
super();
}
public static void main(String[] args){
try{
Properties props =new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"172.16.1.4:1099");
Context ctx = new InitialContext(props);
System.out.println("start ejb client test");
Object obj=ctx.lookup("Example");
ExampleHome home = (ExampleHome)PortableRemoteObject.narrow(obj,ExampleHome.class);
Example example = home.create();
System.out.println(example.example());
example.remove();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
EJB打包
我们需要将以上文件编译的CLASS文件打成一个JAR包,部署到JBOSS中,才能调用ExampleClient执行测试。此jar包可以是任何名字,这里把它命名为myfirst.jar。
按照以上文件的包路径,在正常编译后会形成一examples目录,下面存放各class文件。在和examples同级目录中,还需建立一META-INF目录,里面将放置部署EJB所需要的各种配置文件。
在META-INF下,我们需要有两个文件ejb-jar.xml和JBOSS-service.xml。ejb-jar.xml文件里将包括EJB的各种关键信息,而JBOSS-service.xml则包括EJB部署在JNDI上的一些关键信息。一般网上资料介绍中只会介绍ejb-jar.xml文件,但对于JNDI部署就几乎没有,有的也是从JBOSS2.4.4那边继承过来的,名称为JBOSS.xml,但是在JBOSS3.0.4中,它不会承认这个名字的,只认得JBOSS-service.xml。
ejb-jar.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<description>Your first EJB application </description>
<display-name>JUST A TEST</display-name>
<enterprise-beans>
<session>
<ejb-name>Example</ejb-name>
<home>examples.ExampleHome</home>
<remote>examples.Example</remote>
<local-home>examples.ExampleLocalHome</local-home>
<local>examples.ExampleLocal</local>
<ejb-class>examples.ExampleBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
里面列出了EJB的名称以及各接口和BEAN的类路径和类名。
JBOSS-service.xml </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>