ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)

ejb生命周期

这是两部分系列的第二篇。 第一部分介绍了有状态和无状态EJB的生命周期以及并发行为。 我将在本文中介绍Singleton EJB

Singleton模式可以说是最常用(有时被滥用!)的模式。



单吨又爱它!

单吨又爱它!

Java EE使我们无需编写显式代码(如上图所示)即可实现Singleton模式。

EJB 3.1本身就是Java EE 6的一部分,因此引入了Singleton EJB。

所需要的只是在一个豆类上提供一个@ javax.ejb.Singleton (类级别)注释(如果需要完善其他方面,还可以添加更多注释),以将其指定为Singleton会话bean。

JVM中只有一个实例和一个Singleton EJB实例 –无论有多少客户端访问它。 它不像有状态SB(一个在整个生命周期内附加到单个客户端的bean实例),也不像无状态SB(每个状态的请求)一个新实例。

Singleton Session Bean的生命周期中有哪些不同的状态?

Singleton Bean的生命周期与无状态会话Bean相同-实际上,这是此Bean类型的简单方面之一:

  • 不存在
  • 准备

状态如何变化? 是什么触发了他们?

这是一个快速的表格快照和一个高级图表。 。 。

单例豆–状态转换

单例豆–状态转换

国家过渡 扳机 回呼
DNE转R 首次通过JNDI / DI访问实例或由容器使用@Startup或@DependsOn自动实例化实例时 @PostConstruct
R到DNE 容器关闭–销毁bean实例,或者@PostConstruct注释方法中发生异常 @PreDestroy

注意 :DNE –不存在, R –就绪

如前所述,生命周期是Singleton bean的较简单功能之一。 了解它们的并发方面至关重要。

Singleton Session Bean:并发管理

如前所述– Singleton在JVM中只有一个实例。 在Java EE环境中,并发访问是不可避免的–这就是为什么我们首先使用Java EE之类的技术的原因! 需要确保根据用例和需求,仔细考虑Singleton bean的并发( 锁定 )策略。

Singleton –小心消费!

Singleton –小心消费!

Singleton bean并发可以分为2个主要类别

  • 容器托管(默认)
  • Bean托管

容器管理并发

  • 顾名思义,容器对Bean应用了明智的默认配置
  • 可以使用注释和XML(部署描述符)进行控制
  • 在bean类本身上使用@ javax.ejb.ConcurrencyManagement注释明确声明
    • 默认值为javax.ejb.ConcurrencyManagementType.CONTAINER
  • 容器提供了两种可能的锁定策略 –适用于bean类或其单个方法
    • @ javax.ejb.Lock ,其值为javax.ejb.LockType.READ –在没有写锁的情况下允许并发访问
  • 可以在Bean类或方法上指定@ javax.ejb.AccessTimeout以确保线程在不确定的时间段内不会阻塞或持有锁

Bean托管并发

  • 该名称清楚地表明– Bean的并发方面留给开发人员。 与容器通过上述构造提供的并发控制相比,在需要更好的并发控制时有意义
  • 需要使用适当的Java并发构造,例如同步,易失等
  • 很难正确!

代码示例

让我们看一个简单的代码片段,以便更好地理解上述事实:

方案一 –容器管理的并发(默认,未明确指定锁定类型)

package com.abhirockzz.wordpress.ejb.lifecycle.singleton;import com.abhirockzz.wordpress.ejb.lifecycle.stateful.MyStatefulBean;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Singleton;
import javax.ejb.Startup;@Singleton
@Startup
public class MySingletonBean {public void act() {System.out.println("Entered MySingletonBean/act() on " + new Date().toString() + " . Singleton 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 MySingletonBean/act() on " + new Date().toString() + " . Singleton instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());}
}
package com.abhirockzz.wordpress.ejb.lifecycle.singleton;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 = "SingletonTestServlet", urlPatterns = {"/SingletonTestServlet"})
public class SingletonTestServlet extends HttpServlet {public SingletonTestServlet() {}@InjectMySingletonBean mySingleton;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Entered SingletonTestServlet/doGet() on " + new Date().toString() + " . Servlet instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());mySingleton.act();}}

使用Apache JMeter –我在SingletonTestServlet触发了2个并发线程(是的,只有两个。这更多是演示,而不是负载测试竞赛!)

cmc-jmeter-1

cmc-jmeter-2

cmc结果

观察结果

查看日志,可以轻松得出以下几点:

  • Servlet当然不是线程安全的,因此有两个线程同时进入
  • 其中一个线程在Singleton bean类中输入方法(标记为红色),由于容器强制使用默认的WRITE锁定类型 ,因此禁止进一步访问
  • 第一个线程完成执行后,最初被阻塞的第二个线程(标记为绿色)就有机会执行Singleton bean方法
  • 很简单!

方案二 –坚持使用容器管理的并发性。 将显式锁定类型从WRITE更改为READ

import com.abhirockzz.wordpress.ejb.lifecycle.stateful.MyStatefulBean;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MySingletonBean {@Lock(LockType.READ)public void act() {System.out.println("Entered MySingletonBean/act() on " + new Date().toString() + " . Singleton 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 MySingletonBean/act() on " + new Date().toString() + " . Singleton instance " + this.hashCode() + " Thread : " + Thread.currentThread().getName());}
}

当应用程序被2个并发线程轰炸(双关!)时,会发生什么情况。 。 。 ?

结果

  • 如预期的那样,两个线程同时进入Servlet
  • 线程之一进入Singleton bean类中的方法(标记为红色)
  • 第二个线程(标记为绿色)也设法同时进入Singleton bean方法(检查时间戳记)
  • 再次-非常简单!

我现在所描述的不是Bean管理并发。 如上所述,将BMC用于Singleton会将责任转移给开发人员,并且他可以自由地将并发功能编码到Bean中,这可以简单地在每种方法或其他机制(例如,从java.util.concurrent API)上使用同步来完成。

建议阅读

  • EJB(3.2)规范

干杯!

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

ejb生命周期

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

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

相关文章

linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...

操作系统 RHEL5如果你在linux上执行了如下操作chmod -R 777 / 或者 chmod -R 700 /那么恭喜你,你的系统即将崩溃,重启之后,你进不了图形界面,而且很多服务都起不来为什么呢?因为linux中,系统的有些文件和目…

JDK 14 / JEP 305模式匹配“ Smart Casts”实例

我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”,这意味着在某些情况下使用instanceof不一定是错误的,但是使用它有时表示可以以一种更干净的方式解决设计问题,如所述本文末尾引用的一些资源中的内容(包括有关Java以…

linux美化原理,x-window字体原理及美化

x-window字体原理及美化发布时间:2006-10-07 01:25:15来源:红联作者:caldo1. 简介在我必须处理的一堆讨厌事中,有一项就是没完没了的 X 缺省字体和字体设定 (我专指 XFree86,其它的 X 也许比较好)。有些程序缺省使用固定宽度字体 (fixed width fonts)&am…

易流即时配送_即时大数据流处理=即时风暴

易流即时配送在Ubuntu背后的公司Canonical,每6个月进行一次技术工作,以第一手测试我们的工具并向其他人展示新想法。 这次,我创建了一个即时大数据解决方案,更具体地讲是“即时风暴”。 Storm现在是Apache基金会的一部分&#xf…

c语言有参有类最小公倍数,【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数...

程序分析:在数学中,两个数的最小公倍数两个数的乘积/两数的最大公约数。求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N。如果余数为0,则N即为所求;如果…

csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现

试题编号:201509-3试题名称:日期计算 时间限制:1.0s 内存限制:256.0MB问题描述:成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如&…

osgi架构与linux_OSGi:进入微服务架构的门户

osgi架构与linux在构建可扩展,可靠的分布式系统的背景下,“模块化”和“微服务体系结构”这两个术语如今经常出现。 众所周知,Java平台本身在模块化方面很弱( Java 9将通过交付Jigsaw项目来解决此问题),这为…

引入我们全新的YouTube频道进行视频课程编程

嘿,极客们, 收到社区的反馈并紧贴行业发展趋势,我们非常高兴宣布推出全新的Youtube频道 ! 在我们的频道上,我们将主持与Java编程有关的视频课程,但通常也会进行软件开发。 我们将介绍代码演练以及完整的…

田忌赛马c语言程序设计,还是杭电1052田忌赛马

已结贴√问题点数:20 回复次数:2还是杭电1052田忌赛马//昨天那个算法漏洞挺大,但我重新构思了,但运行到312ms还是wa了。我测试了许多数据,结果是对的,郁闷了,谁能救救我啊?#include&…

ArrayList clone()– ArrayList深拷贝和浅拷贝

示例程序以ArrayList克隆方法为例。 学生对象上的ArrayList深层复制和浅层复制示例。 1.简介 ArrayList clone()– ArrayList深复制和浅复制 。 ArrayList clone()方法用于创建list的浅表副本 。 在新列表中,仅复制对…

南京邮电大学c语言实验报告4,南京邮电大学算法设计实验报告——动态规划法...

《南京邮电大学算法设计实验报告——动态规划法》由会员分享,可在线阅读,更多相关《南京邮电大学算法设计实验报告——动态规划法(12页珍藏版)》请在人人文库网上搜索。1、实 验 报 告(2009/2010学年 第一学期)课程名称算法分析与设计A实验名称动 态 规 …

启动jboss_3种启动JBoss BPM流程的基本方法

启动jboss这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法。 规划项目可能包括流程项目,但是您是否考虑过可以启动流程的各种方式? 也许您的JBoss BPM Suite在您的体系结构中本地运行,也许您在云中运行,但是无论它…

单片机控制灯光亮度c语言程序,基于51单片机控制LED灯光亮度并报警

利用pwm控制led灯光亮度大小。可以显示许多亮度等级 到最低或者最高亮度等级会发出报警。设计思路:LED一般是恒流操作的,如何改变LED的亮度呢?答案就是PWM控制。在一定的频率的方波中,调整高电平和低电平的占空比,即可…

将Quarkus应用程序部署到AWS Elastic Beanstalk

Elastic Beanstalk允许在AWS云中部署和管理应用程序,而无需了解运行这些应用程序的基础架构。 使用Elastic Beanstalk,您可以运行可处理HTTP请求的网站,Web应用程序或Web API,但也可以运行辅助应用程序以运行长任务。 Elastic Be…

c语言中rand()%900,c语言 n=rand()%5是什么意思

rand()函数会产生范围为0至32767的随机数,% 让它与5求余,变成0至4的随机数,不过每次启动程序产生的随机数都相等,在用srand(unsigned int)输入种子数后产生的才不一样,一般都用的 srand((unsigned int)time(NULL)) 产生…

gradle 构建应用流程_使用Gradle构建和应用AST转换

gradle 构建应用流程最近,我想在Gradle项目中构建并应用本地ast转换。 虽然我可以找到几个有关如何编写转换的示例,但找不到完整的示例来显示完整的构建过程。 转换必须单独编译然后放在类路径中,因此其源代码不能简单地放在Groovy源代码树的…

c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现

任何一个对C稍稍有了解的人都知道malloc、calloc、free。前面两个是用户态在堆上分配一段连续(虚拟地址)的内存空间,然后可以通过free释放,但是,同时也会有很多人对其背后的实现机制不了解。这篇文章则是通过介绍这三个函数,并简单…

在雅加达EE TCK中使用Arquillian的可能方法

最近,我们讨论了如何创建独立的Jakarta Batch测试套件(TCK)。 对于大多数提交者而言,使用Arquillian将测试从实现中如何执行抽象化是很自然的。 但是Romain提出了一个有趣的想法,即使用纯JUnit5引起了我的思考。 它并没…

c语言怎么循环输入单个字符,c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,...

c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,0HIDE152019.04.28浏览4次分享举报c语言输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束&#xf…

gradle发布jar_使用Gradle将JAR工件发布到Artifactory

gradle发布jar因此,我浪费了一两天(只是投资)来了解如何使用Gradle将JAR发布到本地运行的Artifactory服务器。 我使用Gradle Artifactory插件进行发布。 我迷失在无穷循环中,包括各种版本的各种插件和执行各种任务。 是的&#xf…