自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 EE的ManagedExecutorService异步执行事务相关推荐

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

    java ee 自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自从Java EE时代开始以来就缺少的一件事是能够使用成 ...

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

    java与java ee 自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自Java EE诞生以来,缺少的一件事就是能够 ...

  3. java 线程 交给spring_浅谈Java中spring 线程异步执行

    多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了.spring封装了Java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说 ...

  4. java ee打印功能_Java EE:异步构造和功能

    java ee打印功能 介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B ( ...

  5. Java EE:异步构造和功能

    介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B (接收方)发送消息时,通信 ...

  6. 人员雇佣 网络流_雇用Java EE开发人员的一些面试问题

    人员雇佣 网络流 互联网上充斥着Java开发人员的面试问题. 这些问题的主要问题是,它们仅证明候选人具有良好的记忆力,并记住所有语法,结构,常量等.对他/她的逻辑推理没有真正的评估. 我在下面列举一些 ...

  7. 雇用Java EE开发人员的一些面试问题

    互联网上充斥着Java开发人员的面试问题. 这些问题的主要问题是,它们仅证明候选人具有良好的记忆力,并且记住所有语法,结构,常量等.对他/她的逻辑推理没有真正的评估. 我在下面列举了一些面试问题的示例 ...

  8. java ee domain作用_java EE应用概述

    1.javaEE应用的分层模型 不管是经典的Java EE架构,还是轻量级的Java EE架构,大致上都可以分为以下几层: Damain Object(领域对象)层:该层是由系列的POJO(普通的,传 ...

  9. Oracle与JCP执行委员会分享了他们的Java EE策略

    Anil Gaur是Oracle集团负责Java EE和WebLogic Server的副总裁.他受邀在上一次的JCP执行委员会会议上发表了演讲,透露了有关Java EE未来发展的一些信息.他所传达的 ...

最新文章

  1. 数据千万条,备份第一条,数据找不回,老板两行泪
  2. Kubernetes — Flannel CNI
  3. Auto.js 调用系统短信、电话
  4. python redis事务_python redis事务源码及应用分析
  5. 只要存心谦卑,各人看别人比自己强。
  6. Ehab and another construction problem(水题)
  7. 比特币源码学习笔记(一)
  8. STM32工作笔记0080---UCOSIII系统内部任务
  9. Robocopy命令实现文件服务器每日镜像备份/增量备份操作
  10. 体验下Xcode5与ios7
  11. globeimposter 解密工具_WinRAR加密和压缩伪装成GlobeImposter勒索软件,易于安全专家解密...
  12. HTB TIER 2 Archetype wp
  13. 全球及中国报刊行业运营策略与未来发展态势研究报告2022版
  14. 在团购网上空手赚钱项目,你敢做就敢赚!
  15. 智能访客机要注意这些陷阱
  16. 计算机的显示器作用是什么意思,显示器中的DCR是什么意思 显示器dcr要不要开...
  17. java数组实现五子棋
  18. ImageIO工具类简介及应用
  19. 一款功能强大的Web接口和网页测试工具
  20. Spooling技术简单熟悉

热门文章

  1. xrkmonitor监控mysql_xrkmonitor字符云监控系统
  2. android 应用程序 判断 ,如何判断Android应用程序是否正在前台运行?
  3. 如何基于tomcat构建web站点
  4. ibatis(2)ibatis是什么
  5. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
  6. 夜神模拟器模拟安卓测试_使用模拟进行测试
  7. java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流
  8. junit 静态方法_预期异常规则和模拟静态方法– JUnit
  9. java scala_经过几天的Scala回归Java的10个最烦人的事情
  10. 操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序