日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EJB钝化和激活示例

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EJB钝化和激活示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在本教程中,我們將了解狀態(tài)Java企業(yè)會(huì)話Bean中激活和鈍化的工作方式。

1.簡(jiǎn)介

有狀態(tài)會(huì)話Bean通常保存有關(guān)特定客戶端的信息,并在整個(gè)會(huì)話中保存該信息。 但是,事實(shí)是,客戶端會(huì)話往往會(huì)在相當(dāng)長(zhǎng)的時(shí)間內(nèi)保持活動(dòng)狀態(tài),當(dāng)然,許多客戶端可以同時(shí)在線。 結(jié)果,EJB容器有必要實(shí)現(xiàn)一種機(jī)制,該機(jī)制使釋放在給定時(shí)刻不使用的資源成為可能,并且可以在需要時(shí)再次激活它。

鈍化會(huì)話Bean意味著將其從容器的會(huì)話EJB緩存中刪除,并將會(huì)話Bean的所有必要信息和屬性存儲(chǔ)在文件中。 激活會(huì)話Bean意味著讀取上述文件并在緩存中恢復(fù)已鈍化的會(huì)話Bean。 就像您想象的那樣,該會(huì)話bean的所有字段都必須可序列化 。

在這個(gè)示例中,我們將創(chuàng)建一個(gè)EAR項(xiàng)目和一個(gè)EJB項(xiàng)目,它們將托管我們的Session Bean,以及一個(gè)動(dòng)態(tài)Web應(yīng)用程序,它將托管Servlet,并測(cè)試上述鈍化和激活屬性。 我們將使用Eclipse Java EE IDE 4,3 Kepler和Glassfish 4.0作為容器。

2.創(chuàng)建一個(gè)新的企業(yè)應(yīng)用程序項(xiàng)目

創(chuàng)建一個(gè)名為SatefulBeansEAR的新企業(yè)應(yīng)用程序項(xiàng)目。在Eclipse IDE中,選擇File-> SatefulBeansEAR > Enterprise Application Project并填寫表單,然后單擊Finish:

3.創(chuàng)建一個(gè)新的EJB Projet

創(chuàng)建一個(gè)名為StatefulEJB的新EJB項(xiàng)目。 我們將基于此創(chuàng)建會(huì)話bean。 轉(zhuǎn)到文件->新建-> EJB項(xiàng)目并填寫表單。 注意選擇“ Add EAR Project”,然后選擇“ StatefulBeansEAR ”作為EAR項(xiàng)目名稱:

單擊下一步兩次,然后選擇創(chuàng)建EJB客戶端JAR以及生成ejb-jar.xml部署描述符:

4.創(chuàng)建一個(gè)令人滿意的會(huì)話Bean

在Project Explorer中打開StatefulEJB Project,并在ejbModule文件夾中創(chuàng)建一個(gè)名為com.javacodegeeks.enterprise.ejb的新源包。 在該程序包中,創(chuàng)建一個(gè)新的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();}

這是會(huì)話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是當(dāng)EJB容器決定以鈍化該會(huì)話bean要執(zhí)行的方法。
    • private void postActivate()具有注釋@PostActivate

是EJB容器由于再次需要而激活鈍化會(huì)話Bean時(shí)要執(zhí)行的方法。

此外,如您所見,會(huì)話bean有一個(gè)private PropertyObject myProperty字段。 這個(gè)對(duì)象可以包含有關(guān)會(huì)話,Bean,資源以及任何有用的數(shù)據(jù)的信息。

因此,當(dāng)鈍化bean時(shí),我們希望也必須保存和恢復(fù)此屬性。 因此,正如我們?cè)谝灾刑岬降?#xff0c;它必須是可Serilizable的。 話雖如此,如果您不想存儲(chǔ)此屬性,因?yàn)槟幌M诩せ頑ean時(shí)檢索該資源,則可以使用@Transient注解聲明對(duì)象瞬態(tài)。 我為此對(duì)象創(chuàng)建了一個(gè)名為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項(xiàng)目SatefulEJB的最終結(jié)構(gòu):

5.創(chuàng)建一個(gè)新的動(dòng)態(tài)Web項(xiàng)目

轉(zhuǎn)到文件->新建->動(dòng)態(tài)Web項(xiàng)目。 填寫表單,并確保選中“將項(xiàng)目添加到EAR”,然后將StatefulBeans EAR作為“ EAR項(xiàng)目名稱”:

單擊“完成”后,轉(zhuǎn)到項(xiàng)目資源管理器,然后右鍵單擊項(xiàng)目StatefulBeansTest然后轉(zhuǎn)到“屬性”->“部署程序集”->“添加”->“項(xiàng)目”->“ StatefulEJB”:

6.創(chuàng)建一個(gè)新的Servlet

轉(zhuǎn)到StatefulBeansTest Web項(xiàng)目并創(chuàng)建一個(gè)名為MyServlet的新Servlet:

因此,這將是Web項(xiàng)目的最終結(jié)構(gòu):

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時(shí),它將解析count查詢參數(shù),生成count會(huì)話bean并將其存儲(chǔ)到請(qǐng)求會(huì)話中。 因此,如果存在activate查詢參數(shù),則從會(huì)話中檢索相應(yīng)的bean。

提示: 如果您在確定EJB PassivationObject的可移植JNDI名稱時(shí)遇到麻煩,請(qǐng)?jiān)诓渴痦?xiàng)目時(shí)查看Glassfish的日志或輸出,您會(huì)發(fā)現(xiàn)類似以下內(nèi)容的行: 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.測(cè)試

創(chuàng)建上述項(xiàng)目后,您必須在Glassfish上運(yùn)行StatefulBeansTest 。

為了測(cè)試所需的行為,我們必須以某種方式觸發(fā)特定會(huì)話bean的鈍化和激活。 為了強(qiáng)制Session Bean被鈍化,我們必須使容器將其從Session緩存中刪除。 默認(rèn)情況下,Glassfish最多可以托管512個(gè)會(huì)話bean。 因此,如果我們觸發(fā)請(qǐng)求創(chuàng)建600個(gè)bean的請(qǐng)求,那么其中的一些bean最終將被從緩存中刪除。

該請(qǐng)求可以是:

http://localhost:8080/StatefulBeansTest/MyServlet?count=600

控制臺(tái)中的輸出將是:

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已從緩存中刪除并因此被鈍化。 現(xiàn)在觸發(fā)bean的激活,我們可以簡(jiǎn)單地請(qǐng)求檢索已被鈍化的bean,例如bean31 。

該請(qǐng)求可以是:

http://localhost:8080/StatefulBeansTest/MyServlet?activate=31

控制臺(tái)中的輸出將是:

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

而已。 現(xiàn)在可以確信我們實(shí)際上已將會(huì)話Bean序列化到了光盤,您可以轉(zhuǎn)到Glassfish_installation_folder/glassfish4/glassfish/domains/domain1/session-store ,在其中您可以實(shí)際看到保存Bean的文件夾:

下載Eclipse項(xiàng)目

這是有關(guān)EJB鈍化和激活的示例。 下載本教程的Eclipse項(xiàng)目: EJBPassivationActivation.zip

翻譯自: https://www.javacodegeeks.com/2013/08/ejb-passivation-and-activation-example.html

總結(jié)

以上是生活随笔為你收集整理的EJB钝化和激活示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。