您的位置:首页 > 其它

EJB 2.1 Session Bean实例

2010-11-15 16:41 302 查看
最近一次去中软进行项目集成的时候,对方要求我方提供一个简单的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中,方便项目的最后验收测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: