ejb 示例 2018_EJB钝化和激活示例

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

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,我们必须使容器从会话缓存中将其删除。 默认情况下,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 示例 2018

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

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

相关文章

js微信小程序页面左上角返回跳转指定页面

微信小程序非导航栏tabBar页面左上角返回默认返回上一次的页面&#xff08;即进入当前页面的前一页面&#xff09;&#xff0c;如果需要自定义页面&#xff0c;可以通过js中onUnload函数进行指定页面跳转。 ①关闭所有页&#xff0c;打开url指定页面 onUnload: function () {…

服务器mysql显示链接次数太多,服务器mysql显示链接次数太多

服务器mysql显示链接次数太多 内容精选换一换在本章节中&#xff0c;您将会把游戏应用部署到CCE云容器引擎中&#xff0c;您需要执行以下操作&#xff1a;创建集群&#xff1a;集群是运行应用的逻辑分组&#xff0c;包含一组云服务器资源&#xff0c;每个节点对应一台云服务器。…

使用JUnit 5在Mockito中方便地进行模拟–官方方式

从版本2.17.0开始&#xff0c;如果使用JUnit 5&#xff0c; Mockito提供了官方&#xff08;内置&#xff09;支持来管理模拟生命周期。 入门 为了利用该集成&#xff0c;需要在JUnit 5的junit-platform-engine旁边添加Mockito的mockito-junit-jupiter依赖项&#xff08;有关详…

esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器

这个是来自ESP32官方示例的改版&#xff0c;官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题&#xff0c;所以进行了一些修改主要修改有&#xff1a;1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录页&#xff0c;访问根目录就可以看到3.修改了…

mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

一、 MySQLMyCat分库分表1 MyCat简介java编写的数据库中间件Mycat运行环境需要JDK。Mycat是中间件&#xff0c;运行在代码应用和MySQL数据库之间的应用。前身&#xff1a; corba&#xff0c;是阿里开发的数据库中间件&#xff0c;实现MySQL数据库分库分表集群管理的中间件&…

字符串String截取字符char

字符串类的charAt() 方法可返回指定位置的字符。 stringObject.charAt(index)从键盘输入获取了一个字符串&#xff0c;将其数据类型转换为字符型。 Scanner scan new Scanner(System.in); String str scan.next(); char ca str.charAt(0);示例&#xff1a; import java.u…

Java基本语法(14)--for循环结构

循环结构&#xff1a;在某些条件满足的情况下&#xff0c;反复执行特定代码的功能。 基本格式&#xff1a; for (①初始化部分; ②循环条件部分; ④迭代部分)&#xff5b; ③循环体部分; &#xff5d;如果①&#xff0c;④部分多条语句&#xff0c;语句之间用“&#xff0c;”…

Java 8中的功能接口是什么? @功能注释和示例

函数接口是Java 8最重要的概念之一&#xff0c;实际上为lambda表达式提供了动力&#xff0c;但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它&#xff0c;并花时间学习lambda表达式和Stream API。除非您知道什么是功能接口以及lambda与它之间的关…

win10存储池_3个光威480G SSD组WIN10存储池,深度测试到底值不值得搞

上次由于我SSD不够&#xff0c;所以我用虚拟硬盘的方式&#xff0c;虚拟了3个VHDX硬盘&#xff0c;组了个奇偶校验的存储池&#xff0c;并且简单的做了测试。测试结果是&#xff0c;组存储池确实提高了我们的数据安全性。WIN10存储池&#xff0c;可以让我们玩家省去组RAID&…

截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...

【新朋友】点击上方蓝字“电源之家”关注【老朋友】点击右上角按钮&#xff0c;分享到朋友圈电源之家官方技术③群&#xff1a;522815202(3000人群)(电源行业第一大技术交流QQ群)这个问题很专业&#xff0c;因此答案注定也专业而非科普&#xff0c;非电力电子专业小伙伴看不懂很…

restlet_Restlet框架– Hello World示例

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

在运行时在Spring Cloud Config中刷新属性配置

在本系列Spring Cloud Config的教程系列中&#xff0c;我们将讨论在运行时刷新属性配置的过程&#xff0c;我们将使用Spring Boot致动器/refresh端点进行/refresh 。 此外&#xff0c;我们还将研究使用RefreshScope注释刷新Value属性。 在我的Spring Cloud Config的上一教程中…

pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包&#xff0c;如数据分析工具pandas也是基于numpy构建的&#xff0c;机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。目录如何构建numpy数组如何观察数…

css hack技巧_5种减少Hack的编码技巧

css hack技巧在本文中&#xff0c;我们将探讨五种方法&#xff0c;这些方法可以使用有效的编码来帮助垃圾回收器花费更少的CPU时间分配和释放内存&#xff0c;并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时停止&#xff08;也称为“停止世界”&#xff09;。 一些…

mysql数据库全备_MySQL innobackupex全备是指什么

MySQL innobackupex全备是指什么发布时间&#xff1a;2020-06-03 10:10:31来源&#xff1a;51CTO阅读&#xff1a;133作者&#xff1a;三月下文主要给大家带来MySQL innobackupex全备是指什么&#xff0c;希望这些内容能够带给大家实际用处&#xff0c;这也是我编辑MySQL innob…

数组初始化使用(写)new与不使用(不写)new

首先&#xff0c;数组初始化时&#xff0c;写不写new没有区别的。int arr[] new int[]{ 3, 9, 8};或者int[] arr {3,9,8};编译器遇到 int a[] {3, 8, 9}; 会编译成和 int a[] new int[] {3, 8, 9}; 完全一样的中间代码。 ①不同于String类。String由于实现了常量池&#xf…

Java数组(2)--一维数组

一、一维数组的&#xff08;声明赋值&#xff09;初始化 声明&#xff1a;type var[]; 或 type[] var;&#xff08;示例&#xff1a;int[] age;&#xff09; 初始化&#xff1a; ①动态初始化&#xff1a;声明且为数组元素分配空间&#xff0c;与赋值的操作分开进行 int[] ar…

Java数组(3)--二维(多维)数组

二维数组相当于一维数组的元素是一维数组 一、二维数组声明赋值初始化 动态初始化① int[][] arr new int[3][2];定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为…

workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

文件名称: workflow下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 134 KB上传时间: 2014-09-18下载次数: 3提 供 者: 张华详细说明&#xff1a;java实现的activity工作流实例 -java activity文件列表(点击判断是否您需要的文件&#xff0c;如果是垃圾请在下面评价投诉)…

使用OAuth 2 / OpenID Connect的SSO的Spring Boot 2本机方法

这篇文章是3篇系列文章的最后一部分&#xff0c;该系列文章探讨了如何为基于Spring Boot 2的应用程序启用OAuth2提供程序SSO。 3个帖子是&#xff1a; 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring …