OpenEJB - 另一個選擇

49
– 另一個選擇 林信良, http://openhome.cc

Transcript of OpenEJB - 另一個選擇

Page 1: OpenEJB - 另一個選擇

– 另一個選擇

林信良, http://openhome.cc

Page 2: OpenEJB - 另一個選擇

議程

• 開發環境準備

• 實作進行方式

• 實作主題介紹

• 參考資源

Page 3: OpenEJB - 另一個選擇

開發環境準備 Java Developer Killer…

Page 4: OpenEJB - 另一個選擇

開發環境準備

• Java SE Development Kit 6

– http://java.sun.com/javase/downloads/index.jsp

• NetBeans 6.5 Java Bundles

– http://www.netbeans.org/downloads/index.html

• Apache OpenEJB 3.1

– http://openejb.apache.org/download.html

?不!我們用不到。。XD

Page 5: OpenEJB - 另一個選擇

開發環境準備

• 專案位置:

– USER_HOME/workspace

– 我的環境 c:/workspace

• OpenEJB 位置:

– WORKSPACE/openejb-3.1

– 我的環境 c:/workspace/openejb-3.1

Page 6: OpenEJB - 另一個選擇

開發環境準備

• 在 NetBeans 中新增 OpenEJB 程式庫

– 開啟 NetBeans

– 選單Tools LibrariesNew Library

• Library Name: OpenEJB

• Library Type: Class Libraries

• OK

– Add JAR/Folder…

• 選取 OPENEJB_HOME/lib 下所有的 JAR

• Add JAR/Folder

• OK

– OK

Page 7: OpenEJB - 另一個選擇

實作進行方式

50

Page 8: OpenEJB - 另一個選擇

實作進行方式

• 每個實作 5 到 10 分鐘

• 觀念講解

• 講師示範

重點在組合。。XD

• Copy-and-Paste 實作 - 複製程式片段(請留意檔名)

- 貼到對應位置(請注意位置)

Page 9: OpenEJB - 另一個選擇

實作主題介紹

• Hello! EJB!...Orz

• EJB 單元測試

• Resource 注入(以 MDB 為例)

• Tomcat 與 EJB(一)

• Tomcat 與 EJB(二)

• Stand-alone Server(Optional)

Page 10: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 新建專案

– 選單 FileNew ProjectJavaJava Application

– Project Name: HelloEJB

– Project Location: WORKSPACE

– Finish

• 加入OpenEJB 程式庫

– Libraries右鍵選單Add Library

OpenEJB Add Library

Page 11: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 加入OpenEJB 程式庫

– Libraries右鍵選單Add Library

OpenEJB Add Library

Page 12: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 定義Session Bean Local介面

– Source PackagesNewJava Interface

– Class Name: HelloLocal

– Package: helloejb(你的套件名)

• LAB_FILE/HelloEJB/HelloLocal.txt

Page 13: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 定義實作類別

– Source PackagesNewJava Interface

– Class Name: HelloImpl

– Package: helloejb(你的套件名)

• LAB_FILE/HelloEJB/HelloImpl.txt

Page 14: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 接著是Glassfish?

Page 15: OpenEJB - 另一個選擇

Hello! EJB!…Orz

輕量級 • EJB 也可以…

Page 16: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• Local Server

– OpenEJB can be embedded and treated as

your very own personal EJB container.

• LAB_FILE/HelloEJB/Main-1.txt

Properties properties = new Properties();

properties.setProperty(

Context.INITIAL_CONTEXT_FACTORY,

"org.apache.openejb.client.LocalInitialContextFactory");

properties.put("openejb.home", "C:\\workspace\\openejb-3.1");

properties.put("openejb.configuration","openejb.conf");

Page 17: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• openejb.conf

– HelloEJBNewEmpty File

– FileName: openejb.conf

• LAB_FILE/HelloEJB/openejb.conf.txt

<openejb>

<Deployments dir="C:\workspace\HelloEJB\build\classes\" />

</openejb>

<openejb>

<Deployments jar="C:\workspace\Somewhere\EJBModule1.jar" />

</openejb>

Page 18: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• LAB_FILE/HelloEJB/Main-2.txt

• 注意 JNDI 名稱

– 本地介面:實作類別名稱附加Local名稱

– 遠端介面:實作類別名稱附加Remote名稱

InitialContext context = new InitialContext(properties);

Object obj = context.lookup("HelloImplLocal");

Page 19: OpenEJB - 另一個選擇

Hello! EJB!…Orz

• 執行結果

– XD......OK!

• 完成實作

– SOLUTION\HelloEJB

Page 20: OpenEJB - 另一個選擇

EJB 單元測試

• 輕量級幹嘛? 單元

測試

Page 21: OpenEJB - 另一個選擇

EJB 單元測試

• 開啟專案PREPARED_PRJ\EJBUnitTest

– (相依問題?你的OpenEJB位置可能不同!)

– (如果你對NetBeans不熟,先把OpenEJB放到c:\workspace\openejb-3.1下)

• (建立測試案例)

– (Test PackagesNewJUnit Test)

Page 22: OpenEJB - 另一個選擇

EJB 單元測試

• 建立測試案例

– LAB_FILE/EJBUnitTest/HelloLocalTest-1.txt

– LAB_FILE/EJBUnitTest/HelloLocalTest-2.txt

– LAB_FILE/EJBUnitTest/HelloLocalTest-3.txt

• 執行測試案例

– Test Packagestest.helloejb.HelloLocalTest

Run File

Page 23: OpenEJB - 另一個選擇

EJB 單元測試

• 執行結果

– Tests run: 1, Failures: 0, Errors: 0

• 完成實作

– SOLUTION\EJBUnitTest

Page 24: OpenEJB - 另一個選擇

Resource 注入

EntityManager

DataSource

Topic Queue

依選擇啟用資源

Page 25: OpenEJB - 另一個選擇

Resource 注入

• 以 Message-Driven Bean(MDB) 為例

• 開啟專案PREPARED_PRJ\ResourceInjection

• 使用@Resource – 開啟Source Packageshelloejb.HelloImpl

– LAB_FILE\ResourceInjection\HelloImpl-1.txt

– LAB_FILE\ResourceInjection\HelloImpl-2.txt

• 定義Message-Driven Bean – 開啟Source Packageshelloejb.HelloMessage

– LAB_FILE\ResourceInjection\HelloImpl-1.txt

– LAB_FILE\ResourceInjection\HelloImpl-1.txt

Page 26: OpenEJB - 另一個選擇

Resource 注入

• 複製 openejb.conf

– 切換 NetBeans 至 Files

– 將LAB_FILE\ResourceInjection\openejb.conf

拖放至 ResourceInjection

• openejb.conf 中<Resource>

– 用來定義 DataSource、JMS…

– 本範例使用 ActiveMQ

<Resource id=“XXX" provider=“OOO">

….

</Resource>

Page 27: OpenEJB - 另一個選擇

Resource 注入

<Connector id="JmsConnectionFactory“ …>

….

</Connector>

public class HelloImpl implements HelloLocal {

@Resource(name="JmsConnectionFactory")

private ConnectionFactory connectionFactory;

Page 28: OpenEJB - 另一個選擇

Resource 注入

• 執行測試案例

– Test Packagestest.helloejb.HelloLocalTest

Run File

• 執行結果

– Tests run: 1, Failures: 0, Errors: 0

• 完成實作

– SOLUTION\ResourceInjection

Page 29: OpenEJB - 另一個選擇

Tomcat 與 EJB

JSP/Servlet

EJB +

Page 30: OpenEJB - 另一個選擇

Tomcat 與 EJB(一) • Tomcat 上也可以用 EJB

• 將 openejb.war 部署至 Tomcat 上 – NetBeans 會為使用者建 Cataline_Base

– USER_HOME\netbeans\6.5\apache-tomcat-6.0.18_base\webapps

• 在NetBeans 中啟動Tomcat – 切換至ServicesServersApache Tomcats右鍵

Start

• 現在你可以在 Tomcat 中部署 EJB 了

– http://localhost:8084/openejb/

獲得資源注入的好處

Page 31: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 來寫個Tomcat上的Hello!EJB!。。Orz

• 新建專案

– 選單 FileNew ProjectJava WebWeb Application

– Project Name: HelloEJBTomcat

– Project Location: WORKSPACE/

– Next

– Server: Apache Tomcat

– Finish

Page 32: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 加入Java EE API 程式庫

– Libraries右鍵選單Add JAR/Border

– 選取OPENEJB_HOME/lib/javaee-api-5.0-1.jar

• 建立package

– Source PackagesNewJava Package

– Package Name: hellloejb

– Finish

Page 33: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 複製先前寫好的Stateless Session Bean至helloejb中

– SOLUTION\HelloEJB\src\helloejb\HelloLocal.java

– SOLUTION\HelloEJB\src\helloejb\HelloImpl.java

• 寫個HelloServlet

– Source PackageshelloejbNewServlet

– Class Name: HelloServlet

– Finish

Page 34: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 注入 EJB

• 清空processRequest()方法

public class HelloServlet extends HttpServlet {

@EJB

private HelloLocal hello;

Page 35: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 使用 Stateless Session Bean

– HelloServlet-2.txt

• 執行 Web 應用程式

– HelloEJBTomcatClear and Bulid

– HelloEJBTomcatDeploy

– Source Packageshelloejb.HelloServletRun

...

out.println("<h1>" + hello.doHello("Orz...") + "</h1>");

...

Page 36: OpenEJB - 另一個選擇

Tomcat 與 EJB (一)

• 完成實作

– SOLUTION\HelloEJBTomcat

Page 37: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 可以定義遠端介面

• 讓 Session Bean 實作遠端介面

• 非 Tomcat 客戶端可以存取 Session Bean

– INITIAL_CONTEXT_FACTORY

– PROVIDER_URL

• 繼續上一個實作

– (SOLUTION\HelloEJBTomcat)

Page 38: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 定義遠端介面

• 讓 Session Bean 實作遠端介面

@Remote

public interface HelloRemote {

public String doHello(String message);

}

public class HelloImpl implements HelloLocal, HelloRemote {

}

Page 39: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 在Services中關掉Tomcat,重新Clean、Build、Deploy

• 新建專案 – 選單 FileNew ProjectJavaJava Application

– Project Name: HelloClient

– Project Location: WORKSPACE

– Finish

• 加入OpenEJB 程式庫 – Libraries右鍵選單Add Library

OpenEJB Add Library

Page 40: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 建立package

– Source PackagesNewJava Package

– Package Name: hellloejb

– Finish

• 複製HelloEJBTomcat中的HelloRemote至HelloClient的helloejb中

Page 41: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 撰寫Main

– LAB_FILE\HelloClient\Main.txt

• 對客戶端而言,EJB 現在部署在遠端

Server 上

Properties properties = new Properties();

properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,

"org.apache.openejb.client.RemoteInitialContextFactory");

properties.put(Context.PROVIDER_URL,

"http://127.0.0.1:8084/openejb/ejb");

InitialContext context = new InitialContext(properties);

Object obj = context.lookup("HelloImplRemote");

Page 42: OpenEJB - 另一個選擇

Tomcat 與 EJB (二)

• 執行結果

– XD……OK!

• 完成實作

– SOLUTION\HelloEJBTomcat2

Page 43: OpenEJB - 另一個選擇

Stand-alone Server(Optional)

Page 44: OpenEJB - 另一個選擇

Stand-alone Server(Optional)

• 可將 OpenEJB 作為 Stand-alone Server

• 設定環境變數

• 啟動

set OPENEJB_HOME=c:\workspace\openejb-3.1

set PATH=%OPENEJB_HOME%/bin;%PATH%

openejb start

Page 45: OpenEJB - 另一個選擇

Stand-alone Server(Optional)

• 部署

• 手動部署

– 在 OpenEJB 目錄下建立 apps 資料夾

– 將 EJB JAR 複製至 apps 資料夾

– 啟動 OpenEJB

openejb deploy yourejb.jar

Page 46: OpenEJB - 另一個選擇

Stand-alone Server(Optional)

• Session Bean 必須是遠端介面

• 客戶端

@Remote

public interface HelloRemote {

Properties properties = new Properties();

properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,

"org.apache.openejb.client.RemoteInitialContextFactory");

InitialContext context = new InitialContext(properties);

Object obj = context.lookup("HelloImplRemote");

Page 47: OpenEJB - 另一個選擇

Stand-alone Server(Optional)

• 試試看…

– LAB_FILE\Optional

Page 48: OpenEJB - 另一個選擇

參考資源

• 如果你想學習 EJB3

– http://doc.openhome.cc

– http://www.manning.com/panda/

– http://oreilly.com/catalog/9780596009786/

• 如果想學習更多 OpenEJB

– http://openejb.apache.org/

• 你可以從這邊開始…

– http://openejb.apache.org/examples.html

Page 49: OpenEJB - 另一個選擇

林信良

[email protected]

林信良 http://openhome.cc

http://openhome.cc,

[email protected]

Thank You