2011/08/29

OpenEJB for Tomcat

其實本來專案中的 EJB 是要部署在其他 container 上的,只是懶的重新建立 server,於是找了一下有沒有可以讓 Tomcat 可以支援 EJB 的東西,沒想到還真的有呢!於是簡單的紀錄一下測試的步驟。

環境設定
基本需求:
快速安裝步驟:
  1. 首先你要有一個能正常運行的 Tomcat server
  2. 把從 OpenEJB 抓下來的 openejb.war 放到 ${tomcat.home}/webapps/ 下
    (注意:這個檔案必須名為openejb.war,所以不要去改名稱...)
  3. 啟動 Tomcat,打開網址 http://localhost:8080/openejb/installer 並點下 Install 按鈕

EJB 程式碼部分
由於是舊系統,所以這邊用的是 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>

部署 EJB
編譯成 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" /> 

測試 client 端呼叫 EJB
根據官方的說明文件,用 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 檔還有待研究。

沒有留言:

張貼留言