EJB钝化和激活示例
在本教程中,我們將了解狀態Java企業會話Bean中激活和鈍化的工作方式。
1.簡介
有狀態會話Bean通常保存有關特定客戶端的信息,并在整個會話中保存該信息。 但是,事實是,客戶端會話往往會在相當長的時間內保持活動狀態,當然,許多客戶端可以同時在線。 結果,EJB容器有必要實現一種機制,該機制使釋放在給定時刻不使用的資源成為可能,并且可以在需要時再次激活它。
鈍化會話Bean意味著將其從容器的會話EJB緩存中刪除,并將會話Bean的所有必要信息和屬性存儲在文件中。 激活會話Bean意味著讀取上述文件并在緩存中恢復已鈍化的會話Bean。 就像您想象的那樣,該會話bean的所有字段都必須可序列化 。
在這個示例中,我們將創建一個EAR項目和一個EJB項目,它們將托管我們的Session Bean,以及一個動態Web應用程序,它將托管Servlet,并測試上述鈍化和激活屬性。 我們將使用Eclipse Java EE IDE 4,3 Kepler和Glassfish 4.0作為容器。
2.創建一個新的企業應用程序項目
創建一個名為SatefulBeansEAR的新企業應用程序項目。在Eclipse IDE中,選擇File-> SatefulBeansEAR > Enterprise Application Project并填寫表單,然后單擊Finish:
3.創建一個新的EJB Projet
創建一個名為StatefulEJB的新EJB項目。 我們將基于此創建會話bean。 轉到文件->新建-> EJB項目并填寫表單。 注意選擇“ Add EAR Project”,然后選擇“ StatefulBeansEAR ”作為EAR項目名稱:
單擊下一步兩次,然后選擇創建EJB客戶端JAR以及生成ejb-jar.xml部署描述符:
4.創建一個令人滿意的會話Bean
在Project Explorer中打開StatefulEJB Project,并在ejbModule文件夾中創建一個名為com.javacodegeeks.enterprise.ejb的新源包。 在該程序包中,創建一個新的Interface,它將是EJB的本地視圖:
Passivation.java:
package com.javacodegeeks.enterprise.ejb;import javax.ejb.Local;import com.javacodegeeks.enterprise.ejb.property.PropertyObject;@Local public interface Passivation {void setPropertyObject(PropertyObject propertyObject);PropertyObject getPropertyObject();}這是會話Bean:
PassivationBean.java:
package com.javacodegeeks.enterprise.ejb;import javax.ejb.PostActivate; import javax.ejb.PrePassivate; import javax.ejb.Stateful;import com.javacodegeeks.enterprise.ejb.property.PropertyObject;@Stateful public class PassivationBean implements Passivation {private PropertyObject myProperty;@Overridepublic void setPropertyObject(PropertyObject propertyObject) {this.myProperty = propertyObject;}@Overridepublic PropertyObject getPropertyObject() {return this.myProperty;}@PrePassivateprivate void prePassivate(){// Free resources // ...System.out.println("Passivating EJB. Property value: " + myProperty.getProperty());}@PostActivateprivate void postActivate(){// Reactivate resources// ...System.out.println("Activating EJB. Property value: " + myProperty.getProperty());} }在上面的代碼中:
- private void prePassivate()與帶注釋@PrePassivate是當EJB容器決定以鈍化該會話bean要執行的方法。
- private void postActivate()具有注釋@PostActivate
是EJB容器由于再次需要而激活鈍化會話Bean時要執行的方法。
此外,如您所見,會話bean有一個private PropertyObject myProperty字段。 這個對象可以包含有關會話,Bean,資源以及任何有用的數據的信息。
因此,當鈍化bean時,我們希望也必須保存和恢復此屬性。 因此,正如我們在引言中提到的,它必須是可Serilizable的。 話雖如此,如果您不想存儲此屬性,因為您不希望在激活Bean時檢索該資源,則可以使用@Transient注解聲明對象瞬態。 我為此對象創建了一個名為com.javacodegeeks.enterprise.ejb.property的新源程序包。
PropertyObject.java:
package com.javacodegeeks.enterprise.ejb.property;import java.io.Serializable;public class PropertyObject implements Serializable {private static final long serialVersionUID = 1L;private String property;public PropertyObject(String value){this.property = value;}public String getProperty() {return property;}}因此,這將是EJB項目SatefulEJB的最終結構:
5.創建一個新的動態Web項目
轉到文件->新建->動態Web項目。 填寫表單,并確保選中“將項目添加到EAR”,然后將StatefulBeans EAR作為“ EAR項目名稱”:
單擊“完成”后,轉到項目資源管理器,然后右鍵單擊項目StatefulBeansTest然后轉到“屬性”->“部署程序集”->“添加”->“項目”->“ StatefulEJB”:
6.創建一個新的Servlet
轉到StatefulBeansTest Web項目并創建一個名為MyServlet的新Servlet:
因此,這將是Web項目的最終結構:
MyServlet.java:
package com.javacodegeeks.enterprise.servlet;import java.io.IOException;import javax.naming.InitialContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.enterprise.ejb.Passivation; import com.javacodegeeks.enterprise.ejb.property.PropertyObject;@WebServlet("/MyServlet") public class MyServlet extends HttpServlet {private static final long serialVersionUID = 1L;public MyServlet() {super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("Hello from Servlet");InitialContext ic;Passivation passivation;String beanCountparam = request.getParameter("count");if (beanCountparam != null) {int beanCount = Integer.parseInt(beanCountparam);try {ic = new InitialContext();for (int i = 0; i < beanCount; i++) {passivation = (Passivation) ic.lookup("java:global/StatefulBeansEAR/StatefulEJB/PassivationBean!"+ "com.javacodegeeks.enterprise.ejb.Passivation");passivation.setPropertyObject(new PropertyObject("bean" + i));request.getSession().setAttribute("bean" + i,passivation);}} catch (Exception e) {throw new ServletException(e);}}String beanActivationIndex = request.getParameter("activate");if (beanActivationIndex != null) {try {ic = new InitialContext();passivation = (Passivation) request.getSession().getAttribute("bean" + beanActivationIndex);System.out.println("TestObject property value: "+ passivation.getPropertyObject().getProperty());} catch (Exception e) {throw new ServletException(e);}}}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {}}在上面的代碼中,訪問Servlet時,它將解析count查詢參數,生成count會話bean并將其存儲到請求會話中。 因此,如果存在activate查詢參數,則從會話中檢索相應的bean。
提示: 如果您在確定EJB PassivationObject的可移植JNDI名稱時遇到麻煩,請在部署項目時查看Glassfish的日志或輸出,您會發現類似以下內容的行: 2013-12-13T18:22:28.598 + 0200 | INFO :EJB5181:EJB PassivationObject的便攜式JNDI名稱:(java:global / StatefulBeans / StatefulEJB / PassivationObject,java:global / StatefulBeans / StatefulEJB / PassivationObject!com.javacodegeeks.enterprise.ejb.Passivation)
7.測試
創建上述項目后,您必須在Glassfish上運行StatefulBeansTest 。
為了測試所需的行為,我們必須以某種方式觸發特定會話bean的鈍化和激活。 為了強制Session Bean被鈍化,我們必須使容器將其從Session緩存中刪除。 默認情況下,Glassfish最多可以托管512個會話bean。 因此,如果我們觸發請求創建600個bean的請求,那么其中的一些bean最終將被從緩存中刪除。
該請求可以是:
http://localhost:8080/StatefulBeansTest/MyServlet?count=600控制臺中的輸出將是:
2013-12-30T22:29:36.978+0200|INFO: Hello from Servlet 2013-12-30T22:29:37.315+0200|INFO: Passivating EJB. Property value: bean31 2013-12-30T22:29:37.329+0200|INFO: Passivating EJB. Property value: bean64 2013-12-30T22:29:37.332+0200|INFO: Passivating EJB. Property value: bean70 2013-12-30T22:29:37.345+0200|INFO: Passivating EJB. Property value: bean98 2013-12-30T22:29:37.390+0200|INFO: Passivating EJB. Property value: bean117 2013-12-30T22:29:37.390+0200|INFO: Passivating EJB. Property value: bean116 2013-12-30T22:29:37.390+0200|INFO: Passivating EJB. Property value: bean115 2013-12-30T22:29:37.394+0200|INFO: Passivating EJB. Property value: bean114 2013-12-30T22:29:37.394+0200|INFO: Passivating EJB. Property value: bean113 2013-12-30T22:29:37.394+0200|INFO: Passivating EJB. Property value: bean112 2013-12-30T22:29:37.397+0200|INFO: Passivating EJB. Property value: bean111 2013-12-30T22:29:37.398+0200|INFO: Passivating EJB. Property value: bean110 2013-12-30T22:29:37.399+0200|INFO: Passivating EJB. Property value: bean109 2013-12-30T22:29:37.402+0200|INFO: Passivating EJB. Property value: bean108 2013-12-30T22:29:37.403+0200|INFO: Passivating EJB. Property value: bean107 . . .因此,您可以看到一些Bean已從緩存中刪除并因此被鈍化。 現在觸發bean的激活,我們可以簡單地請求檢索已被鈍化的bean,例如bean31 。
該請求可以是:
http://localhost:8080/StatefulBeansTest/MyServlet?activate=31控制臺中的輸出將是:
2013-12-30T22:33:48.742+0200|INFO: Hello from Servlet 2013-12-30T22:33:48.744+0200|INFO: Activating EJB. Property value: bean31 2013-12-30T22:33:48.745+0200|INFO: TestObject property value: bean31而已。 現在可以確信我們實際上已將會話Bean序列化到了光盤,您可以轉到Glassfish_installation_folder/glassfish4/glassfish/domains/domain1/session-store ,在其中您可以實際看到保存Bean的文件夾:
下載Eclipse項目
這是有關EJB鈍化和激活的示例。 下載本教程的Eclipse項目: EJBPassivationActivation.zip
翻譯自: https://www.javacodegeeks.com/2013/08/ejb-passivation-and-activation-example.html
總結
以上是生活随笔為你收集整理的EJB钝化和激活示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都站是不是成都北站 成都站到底是不是成
- 下一篇: 什么是增根 何谓增根