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部署描述符:

ejb客户端

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:

新的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python进阶_面对对象面对过程

这节主要讲面对对象与面对过程两种编程思想的主要区别。 一. 简单对比 面向过程是一种基础的方法&#xff0c;它考虑的是实际的实现步骤&#xff0c;一般情况下&#xff0c;面向过程是自顶向下逐步求精&#xff0c;其最重要的是模块化的思想方法。 面向对象的方法主要是把事物给…

puppet 安装mysql_Puppet安装dashboard

Puppet安装dashboard安装依赖包[rootmaster ~]# sudo yum install -y mysql mysql-devel mysql-server ruby ruby-devel ruby-irb ruby-mysql ruby-rdoc ruby-ri启动mysql并设置开机启动[rootmaster ~]# service mysqld start [rootmaster ~]# chkconfig mysqld on下载并安装…

命令模式详解

原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html 在阎宏博士的《JAVA与模式》一书中开头是这样描述命令&#xff08;Command&#xff09;模式的&#xff1a; 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模…

JDK 8中几乎命名的方法参数

有时在Java中命名方法参数确实很不错&#xff0c;这看起来可能不会出现很长时间了&#xff0c;但是始终还有其他一些解决方法&#xff0c;例如使用构建器模式来获得类似的行为&#xff0c;这将为一点点。 在我看来&#xff0c;使用JDK 8中的Lambda支持可以使您获得非常接近的效…

深入解析jQuery中的延时对象的概念

首先我们需要明白延时对象有什么用&#xff1f;第一个作用&#xff0c;解决时序以及动态添加执行函数的问题。function a(){alert(1)};function b(){alert(2)};function c(){alert(3)};a();setTimeout(function(){b();},0);c();很明显函数执行顺序是a->c->b,而不是按照函…

c mysql5.7_CentOS7下MySQL5.7的三种安装方式详解

操作系统环境&#xff1a;CentOS 7.4最小化安装[rootnode3 src]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)[rootnode3 ~]# uname -r3.10.0-693.5.2.el7.x86_64[rootnode3 ~]#安装版本为&#xff1a;MySQL 5.7.20一、编译安装MySQL5.71、下载源码包[rootno…

Struts2 学习之小白开始

Struts2 基础知识学习总结 Struts2 概述&#xff1a;Struts2 是一个用来开发 MVC 应用程序的框架&#xff0c;他提供了 Web 应用程序开发过程中的一些常见问题的解决方案&#xff0c;比如对于用户输入信息合法性的验证&#xff0c;统一的布局&#xff0c;国际化等&#xff0c;既…

机器学习的数学基础 - 信息论

机器学习的数学基础 - 信息论 信息论 信息论本来是通信中的概念&#xff0c;但是其核心思想“熵”在机器学习中也得到了广泛的应用。比如决策树模型ID3&#xff0c;C4.5中是利用信息增益来划分特征而生成一颗决策树的&#xff0c;而信息增益就是基于这里所说的熵。所以它的重要…

了解ElasticSearch分析器

令人遗憾的是&#xff0c;许多早期的互联网啤酒配方不一定采用易于消化的格式。 也就是说&#xff0c;这些食谱是通常在电子邮件或论坛帖子中最初组成的非结构化的方向和成分混合列表。 因此&#xff0c;尽管很难轻松地将这些配方放入传统的数据存储中&#xff08;表面上看是为…

c++简单程序设计-2

1.验证性实验部分①函数声明和函数定义各自的作用及二者的区别&#xff1a;函数声明就是调用函数之前提示一下有这个函数函数定义就是写一个函数②什么是形参&#xff1f;什么是实参&#xff1f;函数参数和返回值在函数中起到什么作用&#xff1f;函数定义时写的参数叫做形参&a…

java 同步的方法_关于Java中的同步方法

我有一个关于Java中方法同步的问题.考虑一个具有3个同步方法的类.class MyClass{public synchronized void methodA(){ ... }public synchronized void methodB(){ ... }public synchronized void methodC(){ ... }}考虑myObject,myClass的一个实例.以下内容哪些是对的&#xf…

jQuery获取隐藏域和radio单项框的值

获得只有Name的隐藏Input的值$("input[typehidden][name隐藏Input的名称]").val() 或 $("input[name隐藏Input的名称]:hidden").val()radio设值$("input[typeradio][value值]").attr("checked",true);eg.$("input[typeradio][v…

Linux虚机安装配置Tomcat

d第一步&#xff1a;下载Tomcat包&#xff0c;网址http://tomcat.apache.org/ 选择tar.gz包下载&#xff0c;并传到虚机中 第二步&#xff1a;解压下载好的Tomcat包 命令&#xff1a;tar -zxvf apache-tomcat-8.0.53.tar.gz 第三步&#xff1a;配置环境变量 进入到Tomcat下bin包…

Java Comparable接口的陷阱

Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法。 自然顺序对标量和其他非常简单的对象有意义&#xff0c;但是当我们使用面向业务的领域对象时&#xff0c;自然顺序就变得更加复杂。 从业务经理的角度来看&#xff0c;交易对象的自然顺序可以是交易的价值&…

mysql 创建视图

CREATE VIEW v_image_org_user_album AS--创建视图并命名v_image_org_user_album SELECT --先开from中表的命名 a.id AS imgid,--将a表中的id命名为新的表&#xff08;视图&#xff09;中的imgid字段&#xff0c;剩下的都一样&#xff0c;就是将之前的字段重新命名到…

jQuery.ajaxPrefilter()函数的使用

jQuery.ajaxPrefilter( [dataTypes ], handler(options, originalOptions, jqXHR) )返回: undefined 描述: 在每个请求之前被发送和 $.ajax()处理它们前处理&#xff0c;设置自定义Ajax选项或修改现有选项。 添加的版本: 1.5jQuery.ajaxPrefilter( [dataTypes ], handler(optio…

linux php自动执行_linux下实现定时执行php脚本

在linux中输入命令复制代码 代码如下:crontab -e然后使用vim的命令编辑打开的文件&#xff0c;输入复制代码 代码如下:0 * * * * /usr/bin/php -f /home/userxxx/update.php保存&#xff0c;退出&#xff0c;好了&#xff0c;现在系统会在每个0点自动执行update.php脚本&#x…

Nginx安装及配置详解

nginx概述 nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过三个方面…

Gradle:我们需要另一个构建工具吗?

在Java开发的早期&#xff0c;我们要么没有太多的构建工具需求&#xff0c;要么就使用了其他环境中的工具。 我仍然记得构建shell脚本并创建用于开发Java的文件。 生成文件特别有趣&#xff0c;因为这是一个在设计时就没有考虑Java的工具。 迁移到不同的操作系统环境也很困难。…

servlet简单概括总结

最近在看java web的相关内容&#xff0c;不管是整体还是细节&#xff0c;要学习的知识有很多&#xff0c;所以有一个好的学习体系非常重要。在阅读学习一些博客和教程中关于servlet的内容后&#xff0c;现将知识体系和自己的总结体会进行梳理&#xff0c;希望在更深入理解的同时…