OpenEJB - 另一個選擇
- 2. 議程
• 開發環境準備
• 實作進行方式
• 實作主題介紹
• 參考資源
- 4. 開發環境準備
• Java SE Development Kit 6
– http://java.sun.com/javase/downloads/index.jsp
?不!我們用不到。。XD
• NetBeans 6.5 Java Bundles
– http://www.netbeans.org/downloads/index.html
• Apache OpenEJB 3.1
– http://openejb.apache.org/download.html
- 5. 開發環境準備
• 專案位置:
– USER_HOME/workspace
– 我的環境 c:/workspace
• OpenEJB 位置:
– WORKSPACE/openejb-3.1
– 我的環境 c:/workspace/openejb-3.1
- 6. 開發環境準備
• 在 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
- 8. 實作進行方式
• 每個實作 5 到 10 分鐘
• 觀念講解
• 講師示範
• Copy-and-Paste 實作
- 複製程式片段(請留意檔名)
- 貼到對應位置(請注意位置)
重點在組合。。XD
- 9. 實作主題介紹
• Hello! EJB!...Orz
• EJB 單元測試
• Resource 注入(以 MDB 為例)
• Tomcat 與 EJB(一)
• Tomcat 與 EJB(二)
• Stand-alone Server(Optional)
- 10. Hello! EJB!…Orz
• 新建專案
– 選單 FileNew ProjectJavaJava
Application
– Project Name: HelloEJB
– Project Location: WORKSPACE
– Finish
• 加入OpenEJB 程式庫
– Libraries右鍵選單Add Library
OpenEJB Add Library
- 12. Hello! EJB!…Orz
• 定義Session Bean Local介面
– Source PackagesNewJava Interface
– Class Name: HelloLocal
– Package: helloejb(你的套件名)
• LAB_FILE/HelloEJB/HelloLocal.txt
- 13. Hello! EJB!…Orz
• 定義實作類別
– Source PackagesNewJava Interface
– Class Name: HelloImpl
– Package: helloejb(你的套件名)
• LAB_FILE/HelloEJB/HelloImpl.txt
- 16. 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:workspaceopenejb-3.1");
properties.put("openejb.configuration","openejb.conf");
- 17. Hello! EJB!…Orz
• openejb.conf
– HelloEJBNewEmpty File
– FileName: openejb.conf
• LAB_FILE/HelloEJB/openejb.conf.txt
<openejb>
<Deployments dir="C:workspaceHelloEJBbuildclasses" />
</openejb>
<openejb>
<Deployments jar="C:workspaceSomewhereEJBModule1.jar" />
</openejb>
- 22. 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
- 23. EJB 單元測試
• 執行結果
– Tests run: 1, Failures: 0, Errors: 0
• 完成實作
– SOLUTIONEJBUnitTest
- 24. Resource 注入
EntityManager
DataSource
依選擇啟用資源
Topic
Queue
- 25. Resource 注入
• 以 Message-Driven Bean(MDB) 為例
• 開啟專案PREPARED_PRJResourceInjection
• 使用@Resource
– 開啟Source Packageshelloejb.HelloImpl
– LAB_FILEResourceInjectionHelloImpl-1.txt
– LAB_FILEResourceInjectionHelloImpl-2.txt
• 定義Message-Driven Bean
– 開啟Source Packageshelloejb.HelloMessage
– LAB_FILEResourceInjectionHelloImpl-1.txt
– LAB_FILEResourceInjectionHelloImpl-1.txt
- 26. Resource 注入
• 複製 openejb.conf
– 切換 NetBeans 至 Files
– 將LAB_FILEResourceInjectionopenejb.conf
拖放至 ResourceInjection
• openejb.conf 中<Resource>
– 用來定義 DataSource、JMS…
– 本範例使用 ActiveMQ
<Resource id=“XXX" provider=“OOO">
….
</Resource>
- 27. Resource 注入
public class HelloImpl implements HelloLocal {
@Resource(name="JmsConnectionFactory")
private ConnectionFactory connectionFactory;
…
<Connector id="JmsConnectionFactory“ …>
….
</Connector>
- 28. Resource 注入
• 執行測試案例
– Test Packagestest.helloejb.HelloLocalTest
Run File
• 執行結果
– Tests run: 1, Failures: 0, Errors: 0
• 完成實作
– SOLUTIONResourceInjection
- 30. Tomcat 與 EJB(一)
• Tomcat 上也可以用 EJB
• 將 openejb.war 部署至 Tomcat 上
– NetBeans 會為使用者建 Cataline_Base
– USER_HOMEnetbeans6.5apache-tomcat-
6.0.18_basewebapps
• 在NetBeans 中啟動Tomcat
– 切換至ServicesServersApache Tomcats右鍵
Start
• 現在你可以在 Tomcat 中部署 EJB 了
– http://localhost:8084/openejb/
獲得資源注入的好處
- 31. Tomcat 與 EJB (一)
• 來寫個Tomcat上的Hello!EJB!。。Orz
• 新建專案
– 選單 FileNew ProjectJava WebWeb
Application
– Project Name: HelloEJBTomcat
– Project Location: WORKSPACE/
– Next
– Server: Apache Tomcat
– Finish
- 32. 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
- 33. Tomcat 與 EJB (一)
• 複製先前寫好的Stateless Session Bean至
helloejb中
– SOLUTIONHelloEJBsrchelloejbHelloLocal.java
– SOLUTIONHelloEJBsrchelloejbHelloImpl.java
• 寫個HelloServlet
– Source PackageshelloejbNewServlet
– Class Name: HelloServlet
– Finish
- 34. Tomcat 與 EJB (一)
• 注入 EJB
public class HelloServlet extends HttpServlet {
@EJB
private HelloLocal hello;
…
• 清空processRequest()方法
- 35. Tomcat 與 EJB (一)
• 使用 Stateless Session Bean
– HelloServlet-2.txt
...
out.println("<h1>" + hello.doHello("Orz...") + "</h1>");
...
• 執行 Web 應用程式
– HelloEJBTomcatClear and Bulid
– HelloEJBTomcatDeploy
– Source Packageshelloejb.HelloServletRun
- 37. Tomcat 與 EJB (二)
• 可以定義遠端介面
• 讓 Session Bean 實作遠端介面
• 非 Tomcat 客戶端可以存取 Session Bean
– INITIAL_CONTEXT_FACTORY
– PROVIDER_URL
• 繼續上一個實作
– (SOLUTIONHelloEJBTomcat)
- 38. Tomcat 與 EJB (二)
• 定義遠端介面
@Remote
public interface HelloRemote {
public String doHello(String message);
}
• 讓 Session Bean 實作遠端介面
public class HelloImpl implements HelloLocal, HelloRemote {
…
}
- 39. Tomcat 與 EJB (二)
• 在Services中關掉Tomcat,重新Clean、Build、
Deploy
• 新建專案
– 選單 FileNew ProjectJavaJava Application
– Project Name: HelloClient
– Project Location: WORKSPACE
– Finish
• 加入OpenEJB 程式庫
– Libraries右鍵選單Add Library
OpenEJB Add Library
- 40. Tomcat 與 EJB (二)
• 建立package
– Source PackagesNewJava Package
– Package Name: hellloejb
– Finish
• 複製HelloEJBTomcat中的HelloRemote至
HelloClient的helloejb中
- 41. Tomcat 與 EJB (二)
• 撰寫Main
– LAB_FILEHelloClientMain.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");
- 42. Tomcat 與 EJB (二)
• 執行結果
– XD……OK!
• 完成實作
– SOLUTIONHelloEJBTomcat2
- 44. Stand-alone Server(Optional)
• 可將 OpenEJB 作為 Stand-alone Server
• 設定環境變數
set OPENEJB_HOME=c:workspaceopenejb-3.1
set PATH=%OPENEJB_HOME%/bin;%PATH%
• 啟動
openejb start
- 46. 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");
- 48. 參考資源
• 如果你想學習 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
- 49. Thank You
林信良
http://openhome.cc
http://openhome.cc,
caterpillar@openhome.cc
林信良
caterpillar@openhome.cc