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

自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

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

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

相关文章

离线存储网页服务器无响应,网页保存应注意的问题

您可能感兴趣的话题&#xff1a;IE核心提示&#xff1a;从IE5.0开始&#xff0c;我们浏览网页的时候&#xff0c;能够选择“另存网页”&#xff0c;然后断线脱机浏览&#xff0c;大大节省了在线的网络费用。从IE5.0开始&#xff0c;我们浏览网页的时候&#xff0c;能够选择“另…

在Ubuntu主机下实现与Windows虚拟机共享文件夹

一&#xff0e;概述 由于要实现&#xff35;buntu主机中的一些文件与Windows虚拟机共享&#xff0c;因此要创建一个共享文件夹映射到虚拟机中&#xff0e; 网上许多都是&#xff37;indows主机&#xff0b;&#xff2c;inux虚拟机的配置&#xff0c;在此分享主机是&#xff2c;…

Appium环境搭建-完整版

环境依赖 Node.jsAppiumAppium-desktopAppium-doctorAppium-Python-ClientPythonJDKAndriod SDK以上所需的软件本套教程素材包都提供&#xff0c;可以在视频左下角【获取素材】去对应章节下载&#xff0c;找到Appium环境配置全家桶。 安装Node.js 下载地址&#xff1a;https://…

ubuntu更新python的指令_ubuntu下python模块的库更新(转载)

ubuntu下python模块的库更新亲测有用&#xff0c;非常好ubuntu中python模块的库下载一般用pip安装。然而有时候pip的下载源在国外&#xff0c;就导致下载速度非常慢。这里提供一个方法&#xff1a;首先命令行进入&#xff1a; cd ~/.pip在这个文件夹下面找到(如果没有则自己创建…

配置安全域名https申请免费证书并配置nginx运行环境

补全信息时选项 在这一步需要去查看进度&#xff0c;下载对应文件上传到对应站点根目录里按照要求建的隐藏类型的文件 如下图 讲证书文件按照下面操作 进行配置项配置https 如下 详情下载附件 server { listen 443; server_name wap.ssgsrz.com; ssl on; root /web/wap_ssgsr…

为什么要在Java SE 7的数字中使用下划线-在数字文字中使用下划线

JDK 1.7发行版引入了几个有用的功能&#xff0c;尽管其中大多数都是语法糖&#xff0c;但使用该功能可以大大提高可读性和代码质量。 这样的功能之一是在数字文字中引入下划线 。 从Java 7开始&#xff0c;您可以在Java源代码中向可读性更高的10_000_000_000写一个长数字&#…

如何刻录服务器安装系统光盘启动盘,如何刻录系统光盘

如何刻录系统光盘大家更多的是使用第三方刻录软件&#xff0c;但是win7系统自带刻录功能可以刻录系统盘。那么如何刻录系统光盘&#xff0c;怎么刻录系统盘?下面小编就来给大家介绍如何刻录系统光盘方法。win7系统自带刻录功能刻录系统光盘方法&#xff1a;一、前期准备&#…

plsql导入csv数据,未响应,invalid identifier

问题分析&#xff1a; 1.确保cvs字段名与表字段名一致&#xff0c;不要有空格 2.cvs字段对应表字段的大写&#xff0c;确保表字段都是大写 3.如果字段能对应上&#xff0c;plsql会自动识别出来转载于:https://www.cnblogs.com/code4app/p/9935365.html

微信小程序之发送模板消息(通过openid推送消息给用户)

一、获取access_token access_token是接口调用的凭证&#xff0c;目前有效期为两个小时&#xff0c;需要定时刷新&#xff0c;重复获取将导致上次获取的access_token失效。&#xff08;注&#xff1a;不建议每次调用需要access_token的接口&#xff0c;都去重新获取access_toke…

python全栈开发内容_Python全栈开发之Day02

一. 回顾上节主要内容1. python是一门解释型弱类型高级语言2. python的解释器CPython, PyPy, JPython, IronPython, Ipython3. print(内容1, 内容2)4. 变量程序运行过程中产生的中间值, 暂时存储在内存中.供后面的程序使用命名规范:1. 由字母, 数字, 下户线组成2. 不能是数字开…

JBoss模块很糟糕,无法在JBoss 7下使用自定义Resteasy / JAX-RS

由于JBoss EAP 6.1 / AS 7.2.0是模块化的&#xff0c;并且您可以排除Web应用程序可见的模块&#xff0c;因此您希望可以轻松地忽略内置的JAX-RS实现&#xff08;Rest Easy 2.3.6&#xff09;并使用它。自定义的&#xff08;3.0.6&#xff09;。 但是&#xff0c;可悲的是&#…

Ansible-----条件判断与错误处理

when 在ansible中&#xff0c;条件判断的关键词是when --- - hosts: allremote_user: roottasks:- debug:msg: "System release is centos"when: ansible_distribution "CentOS"ansible_distribution就是facts信息中的一个key&#xff0c;之前如果我们需要…

Ansible 运维自动化 ( 配置管理工具 )

一、关于AnsibleAnsible是一个自动化部署工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说&#xff0c;只要管理员通过ssh登录到一台远程主机上能做的操作&#xff0c;Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件,如:paramiko&…

分解 python_面试官:如何用Python实现将一个整数分解成质因数?

概述今天主要分享一个关于分解质因数的实例&#xff0c;判断的逻辑稍微多了点&#xff0c;一起来看看吧~需求将一个整数分解质因数。例如&#xff1a;输入90,打印出90233*5思路其实根本不需要判断是否是质数&#xff0c;从2开始向数本身遍历&#xff0c;能整除的肯定是最小的质…

题解 P5259【欧稳欧再次学车】

实际上没什么可说的&#xff0c;暴力大模拟就好。 一定要开long long&#xff01; 一定要开long long&#xff01; 一定要开long long&#xff01; &#xff08;不然会炸数据的&#xff01;&#xff01;&#xff01;&#xff09; //Stand up for the faith! #include<bits/s…

如何:在Maven项目(JUnit,Mockito,Hamcrest,AssertJ)中测试依赖项

对于当今的大多数Java项目&#xff0c;JUnit本身还远远不够。 您还需要一个模拟库&#xff0c;也许还有其他东西。 在此迷你操作指南中&#xff0c;我介绍了可以在新的Java项目中开始的测试依赖项。 一切都始于JUnit Maven存储库中的junit组中有两个工件&#xff1a; junit和j…

elementUI vue 编辑中的input的验证残留清除

当使用编辑的时候, 假如上次的验证没通过, 报红了, 下次再点击编辑的时候还会报红,因此要清除验证残留, 方式有两种: this.$refs["from"].resetFields(); //移除校验结果并重置字段值this.$refs["from"].clearValidate(); //移除校验结果 更多专业前端知识…

Kali学习笔记25:Arachni使用(实现分布式扫描)

文章的格式也许不是很好看&#xff0c;也没有什么合理的顺序 完全是想到什么写一些什么&#xff0c;但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习&#xff0c;大牛和杠精们请绕道 Arachni不同于上次介绍的nikto和skipfish 是一个Web界面的一个Web扫描器 Arachni的强大不…

红帽正式宣布发布JBoss BPM Suite 6和JBoss BRMS 6

红帽公司刚刚宣布了这些期待已久的产品的全面上市 &#xff01; 要花费大量精力将社区代码转变为企业质量的软件&#xff0c;客户和最终用户可以在Red Hat支持的生产环境中使用这些代码。 现在是现在和潜在客户学习该产品&#xff0c;让合作伙伴开始使用它并学习基本知识&…

三星sd卡无法删除数据_单反相机里的SD卡在电脑中突然无法识别提示要格式化怎么办?...

大家在这个国庆佳节出去游玩都拍了不少精彩照片吧&#xff0c;昨天就有微信好友求助&#xff0c;说刚刚从外面游玩回到家里&#xff0c;准备把单反相机里64G存储SD卡中的照片用读卡器复制到电脑里&#xff0c;插入电脑后就提示如下图&#xff1a;在电脑中只显示“可移动磁盘”&…