java与java ee_使用Java EE的ManagedExecutorService异步执行事务

java与java ee

自Java EE 7规范发布以来已经过去了一年。 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了。

自Java EE诞生以来,缺少的一件事就是能够使用成熟的Java EE线程。 Java EE 6已经为我们带来了@Asynchronous批注,通过它我们可以在后台执行单个方法,但是真正的线程池仍然遥不可及。 但是,自Java EE 7引入ManagedExecutorService以来,这一切都成为历史:

@Resource
ManagedExecutorService managedExecutorService;

像标准版中众所周知的ExecutorService一样,ManagedExecutorService可用于提交在线程池中执行的任务。 可以选择提交的任务应实现Runnable还是Callable接口。

与普通的SE ExecutorService实例相反,ManagedExecutorService提供了可以访问(例如)来自JNDI的UserTransactions的线程,以便在其执行期间执行JPA事务。 与在SE环境中启动的线程相比,此功能有很大的不同。

重要的是要知道,在ManagedExecutorService的线程池中启动的事务在提交任务的线程的事务范围之外运行。 这使得可以实现以下方案:提交线程将有关已启动任务的一些信息插入数据库,而长时间运行的任务在独立事务中执行其工作。

现在,在我们学习了一些理论之后,让我们开始编写一些代码。 首先,我们编写一个@Stateless EJB,该EJB注入了ManagedExecutorService:

@Stateless
public class MyBean {@ResourceManagedExecutorService managedExecutorService;@PersistenceContextEntityManager entityManager;@InjectInstance<MyTask> myTaskInstance;public void executeAsync() throws ExecutionException, InterruptedException {for(int i=0; i<10; i++) {MyTask myTask = myTaskInstance.get();this.managedExecutorService.submit(myTask);}}public List<MyEntity> list() {return entityManager.createQuery("select m from MyEntity m", MyEntity.class).getResultList();}
}

我们将提交给ManagedExecutorService的任务是从CDI的实例机制中检索的。 这使我们可以在MyTask类中使用CDI的功能:

public class MyTask implements Runnable {private static final Logger LOGGER = LoggerFactory.getLogger(MyTask.class);@PersistenceContextEntityManager entityManager;@Overridepublic void run() {UserTransaction userTransaction = null;try {userTransaction = lookup();userTransaction.begin();MyEntity myEntity = new MyEntity();myEntity.setName("name");entityManager.persist(myEntity);userTransaction.commit();} catch (Exception e) {try {if(userTransaction != null) {userTransaction.rollback();}} catch (SystemException e1) {LOGGER.error("Failed to rollback transaction: "+e1.getMessage());}}}private UserTransaction lookup() throws NamingException {InitialContext ic = new InitialContext();return (UserTransaction)ic.lookup("java:comp/UserTransaction");}
}

在这里,我们可以注入EntityManager来将某些实体持久化到我们的数据库中。 我们需要提交的UserTransaction必须从JNDI中检索。 在普通的受管bean中,无法使用@Resource批注进行注入。

为了规避UserTransaction,我们当然可以调用另一个EJB的方法,并使用另一个EJB的事务将更改提交到数据库。 以下代码显示了使用注入的EJB持久化实体的替代实现:

public class MyTask implements Runnable {private static final Logger LOGGER = LoggerFactory.getLogger(MyTask.class);@PersistenceContextEntityManager entityManager;@InjectMyBean myBean;@Overridepublic void run() {MyEntity myEntity = new MyEntity();myBean.persit(myEntity);}
}

现在,我们只需要利用JAX-RS通过REST接口调用该功能:

@Path("/myResource")
public class MyResource {@Injectprivate MyBean myBean;@Path("list")@GET@Produces("text/json")public List<MyEntity> list() {return myBean.list();}@Path("persist")@GET@Produces("text/html")public String persist() throws ExecutionException, InterruptedException {myBean.executeAsync();return "<html><h1>Successful!</h1></html>";}
}

而已。 通过这几行代码,我们实现了一个功能全面的Java EE应用程序,该应用程序可以通过REST接口调用其功能,并且可以通过其自己的事务在工作线程中异步执行其核心功能。

结论

ManagedExecutorService是一项很棒的功能,可以使用所有标准Java EE功能(如JPA和事务)将异步功能集成到企业应用程序中。 我会说等待是值得的。

  • 示例源代码可以在github上找到。

参考:在Martin's Developer World博客上, 使用Java EE的ManagedExecutorService异步执行了来自我们JCG合作伙伴 Martin Mois的事务 。

翻译自: https://www.javacodegeeks.com/2014/03/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions.html

java与java ee

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

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

相关文章

【案例】无线串口模块 星型网络组网 案例

星型网络技术 01 什么是星型网络 星型网络是有两种网络设备构成&#xff1a;中心节点和终端节点。中心节点是整个星型网络的枢纽&#xff0c;所有终端节点通过无线或者有线的形式连接到中心节点&#xff0c;与中心节点进行信息交互。终端节点之间不能直接进行信息交互&#xf…

【渝粤教育】国家开放大学2018年秋季 3939T★汽车电控技术 参考试题

试卷代号&#xff1a;4972 农业项目投资 试题&#xff08;开卷&#xff09; 2019年1月 一、单项选择题&#xff08;在各题的备选答案中&#xff0c;只有1项是正确的&#xff0c;请将正确答案的序号&#xff0c;填写在题中的括号内。每小题1分&#xff0c;共10分&#xff09; 1…

【详解】单片机、ARM、DSP、模块、CPU 之间的区别对比

单片机 01 什么是单片机 1.png 单片机已广泛称作微控制器&#xff08;MCU&#xff09;&#xff0c;单片机是一块类似PC的芯片&#xff0c;它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上&#xff1b;只是没PC强大&#xff0c;但它可以嵌入到其它设备…

工业级光纤收发器的芯片介绍

工业级光纤收发器的芯片是整个设备的核心&#xff0c;它和一些硬件设备决定了工业级光纤收发器的性能、寿命等是否满足要求。那么&#xff0c;对于光电介质转换芯片的性能具体有哪些呢&#xff1f;下面飞畅科技就给大家详细讲解一下&#xff0c;希望大家对工业级光纤收发器有更…

成都亿佰特物联网无线数传专家:lora无线传输模块网关技术的优缺点

Lora无线传输模块的优势&#xff1a; LoRa网络具备传输数据远距离&#xff0c;工作功能损耗低&#xff0c;无线组网网络节点多&#xff0c;抗干扰能力强&#xff0c;降低成本等特点。 传输数据远距离&#xff1a;高灵敏度-148dBm&#xff0c;网络通讯间隔可以达到几公里 工作…

【渝粤教育】国家开放大学2018年秋季 8063-21T (1)人体解剖生理学 参考试题

编号&#xff1a;8126 座位号 2018&#xff5e;2019学年度第一学期期末考试 制药工程试题 2018年11月 一、名词解释&#xff08;本大题共4小题&#xff0c;每题5分&#xff0c;共20分&#xff09;。 天然药物 生物技术药物 制粒 生物药物 二、单项选择题&#xff08;本大…

Java中的HashSet

介绍&#xff1a; Java中的HashSet实现Set接口&#xff0c;即它不允许重复。 它在内部由HashMap支持&#xff0c;该哈希表基于哈希原理。 我们可以在HashSet中存储一个空值。 默认容量为16&#xff0c;负载系数为0.75&#xff0c;其中&#xff1a; Load factor Number of St…

8口poe交换机产品介绍

八口POE交换机&#xff08;POE31008P&#xff09;提供了从一个网络节点利用5类以太网线的电源和数据的传输。81端口快速以太网端口能用于10/100Mps的连接&#xff0c;其中8个端口可以提供工业标准的IEEE802.3af电源。先进的自感知算法只为标准PD终端设备供电&#xff0c;因而不…

【渝粤教育】国家开放大学2019年春季 0024-22T建筑工程管理与实务 参考试题

科目编号&#xff1a;0603 座位号 2017-2018学年度第二学期期末考试 建筑工程管理与实务 试题 2018年 07 月 一、单选题&#xff08;本大题共15小题&#xff0c;每小题3分&#xff0c;共计45分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&…

亿佰特物联网dtu无线数传电台:新一代Lora无线模块通信技术

无线数传模块有的也称呼为无线数传电台&#xff0c;通常把功率小、体积小的无线数传技术设备叫做无线模块&#xff0c;把发射功率大、5W~25W&#xff0c;甚至更大功率的无线数传设备称为电台&#xff08;简称&#xff1a;DTU&#xff09;。 1、大功率无线数传电台的物联网无线…

亿佰特物联网无线模块通信技术分析

成都亿佰特电子科技有限公司自成立以来&#xff0c;一直致力于物联网与互联网无线通信技术的研发和应用的推广及其解决方案的应用拓展&#xff0c;在通信技术、射频技术、数据传输技术、信号处理技术上形成了较强的研发实力&#xff0c;是无线通信技术领域拥有自主知识产权的专…

【渝粤教育】国家开放大学2018年春季 0300-22T图形创意 参考试题

编号&#xff1a;0300 座位号 2017&#xff5e;2018学年度第二学期期末考试 图形创意试题 2018年7月 一、设计制作题&#xff08;100分&#xff09; 以“蝴蝶兰”为造型元素进行视觉联想。根据自己的创意写出完整的图形创意方案。 内容要求及得分&#xff1a; 1.富有新意和趣味…

8口PoE网口供电交换机适用环境介绍

8口POE供电网络交换机 “永不烧设备”智能POE交换机&#xff0c;先进的自感知算法只为IEEE 802.3af终端设备供电&#xff0c;因而不需要去担心会损坏私有标准的PoE或非PoE设备。智能供电系统&#xff0c;过载保护&#xff0c;打破传统电力线布局限制&#xff0c;支持8口通过5类…

亿佰特物联网开关电源模块:压电发声器驱动器

有一种压电发声器驱动器&#xff0c;可以输出 31Vp-p&#xff0c;仅提供 1.8 至 5.5V 的电压 秘密在于 PAM8907 具有内置同步升压转换器和桥式输出。 也可以在输出端选择 22Vp-p – 有一个逻辑输入&#xff0c;可将升压转换器设置为产生 11 或 15.6V&#xff0c;从而导致跨桥…

5g无线网络对电子竞技市场发展影响

电子竞技在全世界都受到了极大的关注。这种通过电脑游戏、视频游戏和智能手机游戏进行的竞赛形式被认为是一项运动&#xff0c;并且正在全球范围内不断发展壮大。从全球电竞市场的规模到不同国家的电竞情况&#xff0c;以及5G网络等网络环境&#xff0c;让电竞越来越受欢迎。 …

【渝粤教育】国家开放大学2018年春季 0701-21T公共政策学 参考试题

科目编号&#xff1a;0701 座位号 2018-2019学年度第二学期期末考试 公共政策学 试题 2018年 7 月 一、单选题&#xff08;本大题共15小题&#xff0c;每小题2分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&#xff09; …

PoE交换机的选择和使用注意事项介绍

PoE交换机不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电 。如果你打算选择或者使用PoE交换机&#xff0c;这些知识点一定要看&#xff0c;可以让你少走弯路、少些麻烦。接下来&#xff0c;杭州飞畅科技的小编来为大家介绍下PoE交换机的选择和使用要点&#…

Zigbee无线协议 和 WiFi通信协议的区别

亿佰特物联网无线通信&#xff1a;Zigbee无线协议 和 WiFi通信协议的区别 物联网领域无线数据传输指的是无线数传模块将工业设备输出或者各种采集的数据进行远程传送&#xff0c;可以无线模拟量采集&#xff0c;也能无线开关量控制。无线数据传输专网有数传电台&#xff0c;宽带…

【渝粤教育】国家开放大学2018年春季 3819-22T燃气安全管理 参考试题

科目编号&#xff1a;3819 座位号 2018-2019学年度第二学期期末考试 燃气安全管理 试题 2018年 7 月 一、填空题&#xff08;本大题共10空&#xff0c;每空3分&#xff0c;共计30分&#xff09; 1&#xff0e;汛情预警四个预警级别分别采用蓝色、__________________、________…

Java UUID

介绍&#xff1a; UUID&#xff08;通用唯一标识符&#xff09;表示一个128位长的唯一值 。 它也被普遍称为GUID&#xff08;全球唯一标识符&#xff09;。 UUID的标准表示形式由十六进制数字组成&#xff1a; 533a4559-e55c-18b3-8456-555563322002并具有36个字符 &#xff…