使用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上找到。
翻译自: https://www.javacodegeeks.com/2014/03/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions.html
使用Java EE的ManagedExecutorService异步执行事务相关推荐
- java ee_使用Java EE的ManagedExecutorService异步执行事务
java ee 自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自从Java EE时代开始以来就缺少的一件事是能够使用成 ...
- java与java ee_使用Java EE的ManagedExecutorService异步执行事务
java与java ee 自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自Java EE诞生以来,缺少的一件事就是能够 ...
- java 线程 交给spring_浅谈Java中spring 线程异步执行
多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了.spring封装了Java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说 ...
- java ee打印功能_Java EE:异步构造和功能
java ee打印功能 介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B ( ...
- Java EE:异步构造和功能
介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B (接收方)发送消息时,通信 ...
- 人员雇佣 网络流_雇用Java EE开发人员的一些面试问题
人员雇佣 网络流 互联网上充斥着Java开发人员的面试问题. 这些问题的主要问题是,它们仅证明候选人具有良好的记忆力,并记住所有语法,结构,常量等.对他/她的逻辑推理没有真正的评估. 我在下面列举一些 ...
- 雇用Java EE开发人员的一些面试问题
互联网上充斥着Java开发人员的面试问题. 这些问题的主要问题是,它们仅证明候选人具有良好的记忆力,并且记住所有语法,结构,常量等.对他/她的逻辑推理没有真正的评估. 我在下面列举了一些面试问题的示例 ...
- java ee domain作用_java EE应用概述
1.javaEE应用的分层模型 不管是经典的Java EE架构,还是轻量级的Java EE架构,大致上都可以分为以下几层: Damain Object(领域对象)层:该层是由系列的POJO(普通的,传 ...
- Oracle与JCP执行委员会分享了他们的Java EE策略
Anil Gaur是Oracle集团负责Java EE和WebLogic Server的副总裁.他受邀在上一次的JCP执行委员会会议上发表了演讲,透露了有关Java EE未来发展的一些信息.他所传达的 ...
最新文章
- 数据千万条,备份第一条,数据找不回,老板两行泪
- Kubernetes — Flannel CNI
- Auto.js 调用系统短信、电话
- python redis事务_python redis事务源码及应用分析
- 只要存心谦卑,各人看别人比自己强。
- Ehab and another construction problem(水题)
- 比特币源码学习笔记(一)
- STM32工作笔记0080---UCOSIII系统内部任务
- Robocopy命令实现文件服务器每日镜像备份/增量备份操作
- 体验下Xcode5与ios7
- globeimposter 解密工具_WinRAR加密和压缩伪装成GlobeImposter勒索软件,易于安全专家解密...
- HTB TIER 2 Archetype wp
- 全球及中国报刊行业运营策略与未来发展态势研究报告2022版
- 在团购网上空手赚钱项目,你敢做就敢赚!
- 智能访客机要注意这些陷阱
- 计算机的显示器作用是什么意思,显示器中的DCR是什么意思 显示器dcr要不要开...
- java数组实现五子棋
- ImageIO工具类简介及应用
- 一款功能强大的Web接口和网页测试工具
- Spooling技术简单熟悉
热门文章
- xrkmonitor监控mysql_xrkmonitor字符云监控系统
- android 应用程序 判断 ,如何判断Android应用程序是否正在前台运行?
- 如何基于tomcat构建web站点
- ibatis(2)ibatis是什么
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
- 夜神模拟器模拟安卓测试_使用模拟进行测试
- java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流
- junit 静态方法_预期异常规则和模拟静态方法– JUnit
- java scala_经过几天的Scala回归Java的10个最烦人的事情
- 操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序