其實本來專案中的 EJB 是要部署在其他 container 上的,只是懶的重新建立 server,於是找了一下有沒有可以讓 Tomcat 可以支援 EJB 的東西,沒想到還真的有呢!於是簡單的紀錄一下測試的步驟。
基本需求:
快速安裝步驟:
- 首先你要有一個能正常運行的 Tomcat server
- 把從 OpenEJB 抓下來的 openejb.war 放到 ${tomcat.home}/webapps/ 下
(注意:這個檔案必須名為openejb.war,所以不要去改名稱...)
- 啟動 Tomcat,打開網址 http://localhost:8080/openejb/installer 並點下 Install 按鈕
由於是舊系統,所以這邊用的是 EJB 2.x 的規格來寫,範例寫的是一顆 stateless 的 session bean,EJB 的介紹在這邊就不詳述了。
Remote介面
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface FruitShop extends EJBObject {
public String getBanana() throws RemoteException;
}
Home介面
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface FruitShopHome extends EJBHome {
public FruitShop create() throws CreateException, RemoteException;
}
Session Bean
import java.rmi.RemoteException;
import javax.ejb.*;
public class FruitShopBean implements SessionBean {
public void ejbActivate() throws EJBException, RemoteException {}
public void ejbPassivate() throws EJBException, RemoteException {}
public void ejbRemove() throws EJBException, RemoteException {}
public void setSessionContext(SessionContext context)
throws EJBException, RemoteException {}
public String getBanana() {
return "You get a banana.";
}
}
別忘了在 classpath 上加上 javaEE 的 jar 檔,以免編譯錯誤。如果照上面的步驟安裝的話,在 ${tomcat.home}/webapps/openejb/lib/ 下可以找到 openEJB 提供的 javaee-api-5.0-3.jar
然後建立一個 ejb-jar.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>FruitShop</ejb-name>
<remote>FruitShop</remote>
<home>FruitShopHome</home>
<ejb-class>FruitShopBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>
編譯成 jar 檔後,放在 ${tomcat.home}/conf/openejb.xml 中設定的路徑下
<!--
#
# The <Deployments> element can be used to configure file
# paths where OpenEJB should look for ejb jars or ear files.
#
# See http://openejb.apache.org/3.0/deployments.html
#
# The below entry is simply a default and can be changed or deleted
-->
<!-- 可以用相對路徑的方式, 相對於openejb.base設定的路徑 -->
<Deployments dir="ejb/" />
<!-- 或是指定一個目錄, 讓openEJB自動搜尋相關jar檔 -->
<Deployments dir="D:/Tomcat/ejb/" />
<!-- 最後還可以直接指定目標jar檔 -->
<Deployments jar="D:/Tomcat/ejb/FruitShop.jar" />
根據
官方的說明文件,用 Remote Client with HTTP (in tomcat) 的方式來呼叫 EJB
import java.util.Properties;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class EJBTest {
public static void main(String args[]) throws Exception {
Properties p = new Properties();
p.put("java.naming.factory.initial",
"org.apache.openejb.client.RemoteInitialContextFactory");
p.put("java.naming.provider.url",
"http://localhost:8080/openejb/ejb");
InitialContext ctx = new InitialContext(p);
Object ref = ctx.lookup("FruitShopRemoteHome");
FruitShopHome home = (FruitShopHome)
PortableRemoteObject.narrow(ref, FruitShopHome.class);
FruitShop remote = home.create();
System.out.println(remote.getBanana()); //You get a banana.
}
}
沒意外的話應該可以從 console 看到輸出。
另外... 關於 eclipse helios 怎樣將 EJB project 輸出 client 用的 jar 檔還有待研究。