greet
+-- Greet.java
+-- GreetHome.java
+-- GreetBean.java
META-INF
+-- ejb-jar.xml
+-- jboss.xml
1.定义远程接口
EJB向外界暴露的接口都在远程接口中进行定义,本例中的EJB只向外界提供了一个接口为calculateMagic,相应的源文件为Greet.java,代码如下:
package greet;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
/**
* 这个接口为‘Greet’定义了远程接口
public interface Greet extends EJBObject
{
public double calculateMagic(double seed) throws RemoteException;
}
2.定义本地接口
EJB的本地接口对创建、管理和销毁EJB的行为进行了描述,本地接口至少应该提供create()方法,以便对EJB创建时的行为进行相应的描述。例子中本地接口对应的源文件为GreetHome.java,代码如下:
package greet;
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface GreetHome extends EJBHome
{
Greet create() throws RemoteException, CreateException;
}
3. 实现Bean类
EJB真正完成的工作是在Bean类中实现的,Bean类必须为远程接口中定义的所有方法提供相应的实现。本例中的Bean类对应的源文件为GreetBean.java:
package greet;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class GreetBean implements SessionBean
{
public double calculateMagic(double seed) {
System.out.println ("Someone called `calculateMagic!'");
return seed * Math.random();
}
public GreetBean() {}
public void ejbCreate() {
System.out.println("Create Greet EJB.");
}
public void ejbRemove() {
System.out.println("Remove Greet EJB.");
}
public void ejbActivate() {
System.out.println("Activate Greet EJB");
}
public void ejbPassivate() {
System.out.println("Passivate Greet EJB");
}
/**
* Set context for `Greet' EJB
*/
public void setSessionContext(SessionContext sc) {
System.out.println("Set context for Greet EJB");
}
}
在给出EJB的接口定义并提供了Bean类的具体实现后,用下面的命令对这些.java文件进行编译,生成相应的.class文件:
javac *.java -classpath \ /usr/jb_tom/jboss/lib/ext/jboss-j2ee.jar:.
根据EJB规范,要想将EJB成功地部署到EJB服务器上,必须为EJB服务器提供相应的部署描述符。部署描述符对所要部署的EJB进行了说明,包括该EJB的远程描述符、本地描述符和Bean类等信息。由于EJB服务器只有在获得这些基本信息后才能正确完成EJB的部署,因此编写EJB描述符是开发EJB时必不可少的一个环节。
对于不同的EJB服务器来说,部署同一EJB时所需的部署描述符可能并不相同。在JBoss平台上,任何将要被部署的EJB都必须提供ejb-jar.xml和jboss.xml两个文件,这两个文件均位于JAR包中的META-INF目录下,用于对将要部署的EJB进行简要的说明。
ejb-jar.xml
ejb-jar.xml是EJB规范定义的标准部署描述符,在任何EJB服务器上部署EJB时都需要用到该部署描述符。本例中用到的ejb-jar.xml代码如下所示:
<?xml version="1.0" encoding="Cp1252"?>
<ejb-jar>
<description>jBoss test application </description>
<display-name>Test</display-name>
<enterprise-beans>
<session>
<ejb-name>GreetEJB</ejb-name>
<home>greet.GreetHome</home>
<remote>greet.Greet</remote>
<ejb-class>greet.GreetBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
jboss.xml
虽然ejb-jar.xml对所有的EJB服务器都是通用的,但它并没有为EJB服务器提供将要被部署的EJB的全部信息。为了能够对EJB的部署进行更灵活的控制,大部分EJB服务器都要求EJB开发者同时提供另外一个文件来对将要部署的EJB进行描述,在JBoss中该文件为jboss.xml,它也位于JAR包中的META-INF目录中。jboss.xml中可以对EJB对应的JNDI名字以及相应的持久性进行说明,在本例中用到的jboss.xml如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>GreetEJB</ejb-name>
<jndi-name>GreetingEJB</jndi-name>
</session>
<secure>false</secure>
</enterprise-beans>
<resource-managers/>
</jboss>
开发EJB的最后一步是将其中所有的类文件和相应的部署描述符压缩成JAR包,然后部署到EJB服务器上。在本例中,JAR包的生成可以通过下面这条命令来实现:
jar cf greetejb.jar greet/*.class META-INF/*.xml
该命令将greet目录下的.class文件和META-INF目录下的.xml文件压缩成greetejb.jar文件。如果想知道生成的JAR包是否正确地包含了所有的文件,可以用命令:
jar cvf greetejb.jar
来查看greetejb.jar中包含的文件。如果得到如下的类似信息,则说明所需的文件都已经被正确地包含在该压缩包中了,信息如下:
0 Sun May 24 15:32:10 CST 2002 META-INF/
68 Sun May 24 15:32:10 CST 2002 META-INF/MANIFEST.MF
1007 Sun May 24 14:35:46 CST 2002 greet/GreetBean.class
209 Sun May 24 14:35:46 CST 2002 greet/Greet.class
251 Sun May 24 14:35:46 CST 2002 greet/GreetHome.class
493 Sun May 24 08:40:00 CST 2002 META-INF/ejb-jar.xml
303 Sun May 24 08:43:22 CST 2002 META-INF/jboss.xml
生成的JAR包在JBoss上的部署相当简单,只需要将该文件复制到JBoss的deploy目录下就可以了,命令如下:
cp greetejb.jar /usr/jb_tom/jboss/deploy/
JBoss支持热部署,deploy目录下所有文件的改变都会被JBoss自动检测到,并根据检测结果对相应的EJB进行
[INFO,ContainerFactory] Deploying GreetEJB
[INFO,GreetEJB] Initializing
[INFO,GreetEJB] Initialized
[INFO,GreetEJB] Starting
[INFO,GreetEJB] Started
至此,EJB在JBoss平台上的部署就全部完成了,如果想知道该EJB能否正常地工作,则需要为其编写专门的客户端程序进行测试。
EJB存在的价值在于为其客户提供相应的服务,EJB客户包含的范围相当广泛,可以是另外的EJB、普通的JavaBean、JSP页面、Applet或者标准的Java应用程序。GreetClient.java是已经部署好的EJB的客户程序,其完整的源码如下所示:
import javax.naming.*;
import java.util.Hashtable;
import javax.rmi.PortableRemoteObject;
import greet.*;
class GreetClient
{
public static void main(String[] args) {
System.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.Naming ContextFactory");
System.setProperty("java.naming.provider.url",
"localhost:1099");
try {
// Get a naming context
InitialContext jndiContext = new InitialContext();
System.out.println("Got context");
Object ref = jndiContext.lookup("GreetingEJB");
System.out.println("Got reference");
GreetHome home = (GreetHome)
PortableRemoteObject.narrow (ref, GreetHome.class);
Greet greet = home.create();
System.out.print("The magic number from server is ");
System.out.println(greet.calculateMagic(123.456));
} catch(Exception e) {
System.out.println(e.toString());
}
}
}
用下面的命令对EJB客户端程序进行编译:
javac GreetClient.java \
-classpath /usr/jb_tom/jboss/lib/ext/jboss-j2ee.jar:.
如果一切正常,就可以运行客户端程序来对EJB进行测试了,命令如下:
java -cp \
$CLASSPATH:/usr/jb_tom/jboss/client/jboss-client.jar:. \
GreetClient
小结
本文以一个无状态的会话Bean为例,讲述了在JBoss平台上开发和部署EJB的全过程,对JBoss的安装、EJB的创建、EJB的部署及EJB的测试做了简要介绍。作为一个开放源码的EJB服务器,JBoss已经开始被越来越多的企业所接受,基于JBoss的成功案例屡见不鲜。有关JBoss的更多信息,请访问JBoss的网站http://www.jboss.org。
本文地址:http://com.8s8s.com/it/it12833.htm