EJB 2.1 Session Bean实例

来源:互联网 发布:qq同步助手网络不给力 编辑:程序博客网 时间:2024/05/16 09:01

最近一次去中软进行项目集成的时候,对方要求我方提供一个简单的EJB例子,并利用编写的分布式部署工具,将其部署到三家国产中间件平台中,测试是否能正确的运行。

首先就是为OnceAS编写一个基于EJB 2.1的Session Bean实例,并用JBOSS做实验来测试EJB例子的正确性,采用的JBoss版本为5.1.0GA。

编写的EJB例子名为Fibonacci,它主要包括一个返回输入整数的fibonacci数的函数,并最终通过远程的客户端程序进行调用。

一、EJB实例本身主要分为4个部分:

1、远程接口Fibonacci.java

package com.once.ejbsample;import java.rmi.RemoteException;import javax.ejb.EJBObject;/** * Remote interface of this EJB sample * * @author hehai */public interface Fibonacci extends EJBObject{ public long getFibonacci(int n) throws RemoteException;}

2、本地接口FibonacciHome.java

package com.once.ejbsample;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBHome;/** * Home interface of this EJB sample * * @author hehai */public interface FibonacciHome extends EJBHome{ Fibonacci create() throws RemoteException, CreateException;}

这里必须要抛出这两个异常,否则会导致EJB无法被JBoss识别。

3、Session Bean的实现FibonacciBean.java

package com.once.ejbsample;import javax.ejb.SessionBean;import javax.ejb.SessionContext;/** * Bean implementation of this EJB sample * * @author hehai */public class FibonacciBean implements SessionBean{ public long getFibonacci(int n) { if (n < 0) { return -1; } else if (n == 0) { return 1; } else if (n == 1) { return 1; } else { return getFibonacci(n - 1) + getFibonacci(n - 2); } } public void ejbCreate() { System.out.println("Fibonacci Bean Created"); } public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext ctx) {}}

4、部署描述文件ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?><ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1"> <enterprise-beans> <session> <ejb-name>Fibonacci</ejb-name> <home>com.once.ejbsample.FibonacciHome</home> <remote>com.once.ejbsample.Fibonacci</remote> <ejb-class>com.once.ejbsample.FibonacciBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>

二、完成上述4个部分之后,就需要为JBoss编写其专有的部署描述文件jboss.xml,主要是为这个Sesion Bean指明jndi,如下所示:

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

这样JBoss在运行这个实例后,远程就可以通过jndi-name,即FibonacciHome来查找到这个EJB实例。

三、将第一第二部分在一起打包成EJBSample.jar,并放到JBoss的部署目录\server\default\deploy下,顺利的话,启动JBoss,并访问控制台,就可以发现这个EJB实例已经部署上了,如下图所示:

四、测试的最后一部分工作,就是编写一个客户端程序,来测试这个EJB的函数是否能被正常访问。测试程序如下:

import javax.naming.Context;import javax.naming.InitialContext;import javax.rmi.PortableRemoteObject;import com.once.ejbsample.Fibonacci;import com.once.ejbsample.FibonacciHome;/** * Test program of this EJB sample * * @author hehai */public class FibonacciClient { public static void main(String[] args) { try { java.util.Properties p = new java.util.Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces"); p.put(Context.PROVIDER_URL, "localhost:1099"); Context jndiContext = new InitialContext(p); Object ref = jndiContext.lookup("FibonacciHome"); FibonacciHome home = (FibonacciHome) PortableRemoteObject.narrow( ref, FibonacciHome.class); Fibonacci ff = home.create(); long result; for (int i = 10; i >= -1; i--) { result = ff.getFibonacci(i); System.out.println("Fibonacci of [" + i + "] is [" + result + "]"); } } catch (java.rmi.RemoteException re) { re.printStackTrace(); } catch (javax.ejb.CreateException ce) { ce.printStackTrace(); } catch (Throwable t) { t.printStackTrace(); } }}

运行结果为:

Fibonacci of [10] is [89]Fibonacci of [9] is [55]Fibonacci of [8] is [34]Fibonacci of [7] is [21]Fibonacci of [6] is [13]Fibonacci of [5] is [8]Fibonacci of [4] is [5]Fibonacci of [3] is [3]Fibonacci of [2] is [2]Fibonacci of [1] is [1]Fibonacci of [0] is [1]Fibonacci of [-1] is [-1]

对于测试程序,需要注意以下几点,首先你需要配置JBoss的命名服务的端口,默认为1099,然后通过jndi来查找到这个EJB实例。然后引入EJB的本地和远程端口,并通过RMI来访问这个EJB实例的函数。

五、实验证明,这个EJB实例编写是正确的,它可以运行在JBoss中,下一步就需要将其移植到OnceAS中,方便项目的最后验收测试。