ejb生命周期

对于经验丰富的专业人员来说,Java EE组件生命周期和与并发相关的详细信息可能不是新知识,但是对于初学者来说,这可能会花费一些时间。

就EJB而言,了解其生命周期 (以及相关的并发场景)对于确保使用EJB的正确用法和解决方案设计至关重要。 容易滥用它们!

豆的生命周期

我将在这篇文章中快速介绍无状态有状态的 bean,暂时跳过Lima Beans!

  • 有状态会话Bean –生命周期+并发处理
  • 无状态 bean –仅用于并发模型,因为我在之前的一篇文章中曾简要介绍了生命周期。

有状态会话Bean的生命周期中有哪些不同的状态?

  • 不存在
  • 准备
  • 钝化的

是什么触发了他们?

这是一个快速的表格快照和一个高级图表。 有关更多详细信息,请继续阅读。 。 。

无状态会话Bean生命周期状态图

注意 :DNE –不存在, R –就绪, P –钝化,SFSB –有状态会话Bean

国家过渡 扳机 回呼
DNE转R 首次通过JNDI或DI访问SFSB实例时 @PostConstruct
R到DNE 容器关闭,客户端调用用@Remove注释的方法,Bean达到由DD或@StatefulTimeout指定的空闲超时阈值 @PreDestroy
R到P EJB容器会钝化闲置的bean,并根据特定算法将其从活动内存中删除 @PrePassivate
P到DNE Bean达到由DD或@StatefulTimeout指定的空闲超时阈值 注意 :@PreDestroy注释的方法不会被调用
从P到R 客户端被钝化但尚未超时后调用SFSB实例时 @PostActivate

注意 :如果SFSB在请求处理期间引发异常,则其实例将被破坏,即进入DNE状态。 在这种情况下,不会调用@PreDestroy注释方法

现在我们对SFSB的生命周期有了一些了解,让我们尝试看一下这些Bean在负载下的行为,即当多个用户一次使用该应用程序时,它转化为并发访问SFSB实例。

有状态会话Bean:并发管理

线程安全是EJB的核心功能之一。 要注意的一点是,此线程安全性是免费的,并且不需要任何与并发相关的构造都可以由Bean开发人员自己进行编码 (有一些例外 )。 就SFSB而言,EJB容器确保在特定时间只有一个线程可以访问bean实例。

在此示例中,我们尝试通过JMeter调用测试Servlet来模拟对SFSB单个实例的并发访问 。 Servlet通过DI注入bean并在其上调用方法。 SFSB方法仅使用Thread.sleep()假装好像正在执行某些操作。

package com.abhirockzz.wordpress.ejb.lifecycle.stateful;import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;@Stateful
public class MyStatefulBean {public MyStatefulBean() {}public void act() {System.out.println("Entered MyStatefulBean/act() on " + new Date().toString() + " . SFSB instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());try {Thread.sleep(2000);} catch (InterruptedException ex) {Logger.getLogger(MyStatefulBean.class.getName()).log(Level.SEVERE, null, ex);}System.out.println("Exit MyStatefulBean/act() on " + new Date().toString() + " . SFSB instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());}
}
package com.abhirockzz.wordpress.ejb.lifecycle.stateful;import java.io.IOException;
import java.util.Date;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "SFSBTestServlet", urlPatterns = {"/SFSBTestServlet"})
public class SFSBTestServlet extends HttpServlet {public SFSBTestServlet() {}@InjectMyStatefulBean mySFSB;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Entered SFSBTestServlet/doGet() on " + new Date().toString() + " . Servlet instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());mySFSB.act();}}

通过JMeter的HTTP GET请求

通过JMeter进行并发请求模拟

观察结果

  • 由于Servlet本身不是线程安全的,因此实际上有多个线程将进入doGet()方法
  • 并发访问SFSB的单个实例(通过hashCode结果证明)(请参见记录的语句中的线程名称)
  • 但是,只有一个线程将能够访问SFSB实例-其他线程在SFSB方法返回时等待其轮换。 通过控制台上的日志语句可以明显看到此延迟

控制台日志

无状态豆呢?

这些bean 本质上是线程安全的为什么呢 这是因为默认情况下,容器确保每个新请求都由 Bean 的新实例提供服务。 请记住,客户端可以通过3种可能的方式获得对无状态bean的引用-DI,JNDI或通过远程接口(RMI)。 在所有这些情况下,都是容器(代理)拦截了该调用–因此,即使看似多个线程正在访问同一bean实例,它实际上也不是同一实例!

package com.abhirockzz.wordpress.ejb.lifecycle.stateless;import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;@Stateless
public class MyStatelesslBean {public void act() {System.out.println("Entered MyStatelesslBean/act() on " + new Date().toString() + " . SLSB instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());try {Thread.sleep(2000);} catch (InterruptedException ex) {Logger.getLogger(MyStatelesslBean.class.getName()).log(Level.SEVERE, null, ex);}System.out.println("Exit MyStatelesslBean/act() on " + new Date().toString() + " . SLSB instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());}
}
package com.abhirockzz.wordpress.ejb.lifecycle.stateless;import java.io.IOException;
import java.util.Date;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "SLSBTestServlet", urlPatterns = {"/SLSBTestServlet"})
public class SLSBTestServlet extends HttpServlet {@InjectMyStatelesslBean slsb;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Entered SLSBTestServlet/doGet() on " + new Date().toString() + " . Servlet instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());slsb.act();}}

观察结果

  • 由于Servlet本身不是线程安全的,因此实际上有多个线程将进入doGet()方法
  • 容器正在选择SLSB的不同实例 (通过hashCode结果显而易见)来管理并发请求(请参见记录的语句中的线程名称)。
  • 尽管有并发请求,但每个请求线程都由一个新实例提供服务

控制台日志

目前为止就这样了! 我计划在以后的文章中介绍Singleton Session bean。 敬请关注 。 。 。 。

谢谢阅读!

翻译自: https://www.javacodegeeks.com/2014/08/ejb-3-x-lifecycle-and-concurrency-models-part-1.html

ejb生命周期

ejb生命周期_EJB 3.x:生命周期和并发模型(第1部分)相关推荐

  1. EJB 3.x:生命周期和并发模型(第1部分)

    Java EE组件生命周期和与并发相关的详细信息对于经验丰富的专业人员而言可能不是新知识,但是对于初学者而言,这可能需要花费一些时间. 就EJB而言,了解其生命周期 (以及相关的并发场景)对于确保使用 ...

  2. 【转】Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  3. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...

    Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...

  4. Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  5. pyqt5信号与槽连接的生命周期与对象引用的生命周期

    pyqt5信号与槽连接的生命周期与对象引用的生命周期,是一致的.举个例子,如果一个变量引用了一个对象,并连接了一个信号,那么如果引用对象发生变化,则原来的连接在新的对象中就不存在了.直接参考代码 fr ...

  6. Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

    说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...

  7. 微信小程序详解——小程序的生命周期和页面的生命周期

    我是一名安卓程序员,我们安卓中最明显的特征就是类具有生命周期.所以当开发小程序的时候,我自然而然的会先研究小程序的生命周期.在Android中是通过Application来管理安卓程序的生命周期,小程 ...

  8. python对象的生命周期_python对象的生命周期

    引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...

  9. 【双碳系列】LEAP碳排放预测、LCA生命周期、GAMS电力、CGE一般均衡模型

    点击查看原文:[双碳系列]LEAP碳排放预测.LCA生命周期.GAMS电力.CGE一般均衡模型 本文围绕双碳专题分为五大内容,分别为: 1.LEAP模型能源环境发展,碳排放建模预测及不确定性分析: 2 ...

最新文章

  1. 图解排序算法之3种简单排序(选择,冒泡,直接插入)
  2. linux 设备事件管理服务 systemd-udevd.service 简介
  3. Matlab实用程序--图形应用-双y轴图形的绘制
  4. JavaScript能力测评经典题及答案(一:数组之查找组元素位置)
  5. BD云20MB/s不限速,随时下架!
  6. MongoDB学习总结(一) —— Windows平台下安装
  7. 自学前端1年,靠着这份面试题和答案,我找到了20K工作
  8. 从头开始编写一个时间序列数据库
  9. 重定向Http status code 303 和 302
  10. saltstack minion端状态监控程序
  11. LINQToSQL中如何更好的手动设置导航字段,并返回实名类型而不是匿名类型
  12. 计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...
  13. 手撕包菜磁力搜索引擎的开源说明
  14. Debian 10上设置和配置证书颁发机构(CA)
  15. 一文彻底学会CSS-3
  16. Three.js 绘图之不规则路径 3D 墙体生成算法
  17. 数美科技荣获《银行家》“十佳智能风控管理创新奖”
  18. 取消CSDN的手机绑定
  19. QQ号强制搜索查询教程
  20. 网络安全事件应急演练各步骤参考模板

热门文章

  1. ssl1125-集合【哈希表二分查找+快排】
  2. The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)
  3. 【LCT】大融合(luogu 4219)
  4. Nacos(七)之Spring Cloud集成
  5. Sentinel(七)之网关限流
  6. MySQL find_in_set()函数
  7. 关系型数据的分布式处理系统:Cobar
  8. 将编号为0和1的两个栈存放于一个数组空间V[m]中。
  9. ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
  10. 用赫夫曼树进行文件解压