网站正在维护模板,宁波seo排名外包公司,如何做镜像网站,网站后台管理系统栏目位置ejb 示例 2018在本教程中#xff0c;我们将了解状态Java企业会话Bean中激活和钝化的工作方式。 1.简介 有状态会话Bean通常保存有关特定客户端的信息#xff0c;并在整个会话中保存该信息。 但是#xff0c;事实是#xff0c;客户端会话往往会在相当长的时间内保持活动状态… ejb 示例 2018 在本教程中我们将了解状态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项目名称 单击两次Next然后选择创建EJB Client 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-13T182228.598 0200 | INFO EJB5181EJB PassivationObject的便携式JNDI名称javaglobal / StatefulBeans / StatefulEJB / PassivationObjectjavaglobal / StatefulBeans / StatefulEJB / PassivationObjectcom.javacodegeeks.enterprise.ejb.Passivation 7.测试 创建上述项目后您必须在Glassfish上运行StatefulBeansTest 。 为了测试所需的行为我们必须以某种方式触发特定会话bean的钝化和激活。 要强制钝化Session Bean我们必须使容器从会话缓存中将其删除。 默认情况下Glassfish最多可以承载512个会话bean。 因此如果我们触发请求创建600个bean的请求那么其中的一些bean最终将从缓存中删除。 该请求可以是 http://localhost:8080/StatefulBeansTest/MyServlet?count600 控制台中的输出将是 2013-12-30T22:29:36.9780200|INFO: Hello from Servlet
2013-12-30T22:29:37.3150200|INFO: Passivating EJB. Property value: bean31
2013-12-30T22:29:37.3290200|INFO: Passivating EJB. Property value: bean64
2013-12-30T22:29:37.3320200|INFO: Passivating EJB. Property value: bean70
2013-12-30T22:29:37.3450200|INFO: Passivating EJB. Property value: bean98
2013-12-30T22:29:37.3900200|INFO: Passivating EJB. Property value: bean117
2013-12-30T22:29:37.3900200|INFO: Passivating EJB. Property value: bean116
2013-12-30T22:29:37.3900200|INFO: Passivating EJB. Property value: bean115
2013-12-30T22:29:37.3940200|INFO: Passivating EJB. Property value: bean114
2013-12-30T22:29:37.3940200|INFO: Passivating EJB. Property value: bean113
2013-12-30T22:29:37.3940200|INFO: Passivating EJB. Property value: bean112
2013-12-30T22:29:37.3970200|INFO: Passivating EJB. Property value: bean111
2013-12-30T22:29:37.3980200|INFO: Passivating EJB. Property value: bean110
2013-12-30T22:29:37.3990200|INFO: Passivating EJB. Property value: bean109
2013-12-30T22:29:37.4020200|INFO: Passivating EJB. Property value: bean108
2013-12-30T22:29:37.4030200|INFO: Passivating EJB. Property value: bean107
.
.
. 因此您可以看到一些Bean已从缓存中删除并因此被钝化。 现在触发bean的激活我们可以简单地请求检索已被钝化的bean例如bean31 。 该请求可以是 http://localhost:8080/StatefulBeansTest/MyServlet?activate31 控制台中的输出将是 2013-12-30T22:33:48.7420200|INFO: Hello from Servlet
2013-12-30T22:33:48.7440200|INFO: Activating EJB. Property value: bean31
2013-12-30T22:33:48.7450200|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.htmlejb 示例 2018