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,一经查实,立即删除!

相关文章

命令模式详解

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

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…

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包…

Nginx安装及配置详解

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

servlet简单概括总结

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

php超强后门在任意位置创建文件,php大马:.user.ini文件构成的超强PHP后门

这个估计很多同学看了不屑&#xff0c;认为是烂大街的东西了&#xff1a;那么我来个新的吧&#xff1a;。它比用的更广&#xff0c;不管是nginx/apache/IIS&#xff0c;只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi&#xff0c;我的IIS php5.3…

Restlet框架– Hello World示例

Restlet是用于Java平台的轻量级&#xff0c;全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输&#xff0c;数据格式和服务描述标准&#xff0c;例如HTTP和HTTPS&#xff0c;SMTP&#xff0c;XML&#xff0c;JSON&#xff0c;Atom和WAD…

Servlet 3的异步Servlet功能

在深入了解什么是异步Servlet之前&#xff0c;让我们尝试了解为什么需要它。 假设我们有一个Servlet&#xff0c;处理时间很长&#xff0c;如下所示。 LongRunningServlet.java package com.journaldev.servlet;import java.io.IOException; import java.io.PrintWriter;impo…

excel的宏与VBA入门——代码调试

直接介绍重点&#xff1a; 常用的操作是导航栏的逐句与断点&#xff1a; 添加断点&#xff1a;调试->切换断点 单步运行&#xff1a;调试->逐句 查看变量的窗口&#xff1a;视图->本地窗口 转载于:https://www.cnblogs.com/jiangbei/p/9561352.html

php访问服务器文件路径,PHP与服务器文件系统的简单交互

1、php.ini中关于文件上传的设置指令2、文件上传过程(1)上传文件提交表单html代码&#xff1a;Adminstration - upoload new filesUpload new filesUpload a file(2)php处理上传文件代码①在php脚本中&#xff0c;需要处理的数据保存在超级变量数组$_FILES中&#xff0c;开启re…

django F和Q 关键字使用

F 的使用&#xff1a; 想给表里每个价格加上一百就要用上F&#xff0c;直接加是不行的。 转载于:https://www.cnblogs.com/wuheng-123/p/9561422.html

【刷题】BZOJ 4176 Lucas的数论

Description 去年的Lucas非常喜欢数论题&#xff0c;但是一年以后的Lucas却不那么喜欢了。 在整理以前的试题时&#xff0c;发现了这样一道题目“求Sigma(f(i)),其中1<i<N”&#xff0c;其中 表示i的约数个数。他现在长大了&#xff0c;题目也变难了。 求如下表达式的值&…

Java 8的新增功能(第I部分-JavaFX)

免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 Java 8已在大约两个月前完成功能&#xff0c;并且开发者预览版即将来临&#xff08;两周后&#xff09;。 这篇博客文…

mysql数据库sql语句优化

昨天帮同事优化了一个sql语句发出来共勉下: SELECT T.*, ( SELECT S.codeName FROM sys_codelist S WHERE S.codeValue T.packagingtype AND S.kindCode PACKAGING ) AS packagingtypeName, S.codeName AS codename, ( SELECT picpath FROM zl_b_gd_pic WHERE 1 1 AND gdid …

java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…

python第一个程序HelloWorld

在写第一个python程序之前&#xff0c;我们还需要了解的一个东西就是python解释器 解释器&#xff0c;顾名思义&#xff0c;就是解释一段代码的机器&#xff0c;程序运行的平台&#xff0c;例如Java的解释器就是jdk。 我们在写好的python代码&#xff0c;需要在解释器上执行&am…