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 ee

java ee_使用Java EE的ManagedExecutorService异步执行事务相关推荐

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

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

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

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

  3. java starling_Java使用starling分布式消息队列异步处理事务

    介绍:   Starling是一个支持MemCache协议的轻量级持久化服务器.Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台 机器间的异步工作进程.它是著名微博客网站T ...

  4. java starling_Java使用starling分布式消息队列异步处理事务...

    介绍: Starling是一个支持MemCache协议的轻量级持久化服务器.Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台 机器间的异步工作进程.它是著名微博客网站Twi ...

  5. java与java ee_计划Java EE 7批处理作业

    java与java ee Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能. <job id="myJob" xmlns="http://x ...

  6. java web开发中会遇到的异步执行方案

    http://code.google.com/p/asyn4j/wiki/user_guide

  7. Java并发包-java.util.concurrent详解

    转载自https://blog.csdn.net/axi295309066/article/details/65665090 一.阻塞队列BlockingQueue BlockingQueue通常用于 ...

  8. jakarta ee_适用于Java EE / Jakarta EE开发人员的Micronaut

    jakarta ee 城镇中有一个名为Micronaut的新微服务框架. 在本文中,我将从Java EE / Jakarta EE的角度讨论如何冒险使用Micronaut框架. 我是Java EE开发 ...

  9. java与java ee_RxJava + Java8 + Java EE 7 + Arquillian =幸福

    java与java ee 微服务是一种体系结构样式,其中每个服务都实现为一个独立的系统. 他们可以使用自己的持久性系统(尽管不是强制性的),部署,语言等. 由于系统由一个以上的服务组成,因此每个服务将 ...

最新文章

  1. C和C++安全编码笔记:指针诡计
  2. LINUX上MYSQL优化三板斧
  3. SDM管理路由器要进行的相应配置
  4. Thinkphp下嵌套UEditor富文本WEB编辑器
  5. java实现WGS84转其他地图坐标
  6. 课堂练习 5-22 团队如何做决定
  7. 大数问题(高精度运算)
  8. P5643-[PKUWC2018]随机游走【min-max容斥,dp】
  9. 苹果MacBook Air 2018款少量用户会出现主板问题可免费更换
  10. python处理excel的优势-用Python读写Excel文件的方式比较
  11. iOS多线程编程--NSOperation(转)
  12. 运用Python实现猜数字游戏
  13. 制作芭奇站群软件自定义发布接口命令大全
  14. 腾讯云如何搭建PHP环境?
  15. ASP.NET Core WebApi返回结果统一包装实践
  16. 少儿编程是不是智商税
  17. java基础零散知识
  18. 华为手机助手 无法访问服务器,EMUI4.X手机及windowsXP系统无法正常使用华为手机助手问题...
  19. 提升研发质量的三个办法
  20. Unity VR开发教程 OpenXR+XR Interaction Toolkit (六)手与物品交互(触摸、抓取)

热门文章

  1. hdfs日志上传脚本(三)
  2. JNLP(jar包签名)
  3. 关于Python正则表达式的问题
  4. Windows Server AppFabric Caching
  5. textarea 自适应窗口|IE、firefox 显示同样的效果
  6. QQ 邮箱的换肤 bug
  7. python pip 报错 Command “python setup.py egg_info“ failed with error code 1 解决方法
  8. linux make 命令行 定义宏(-D)传递给C源代码 简介
  9. java ssh框架 struts spring hibernate 简介
  10. linux 新建用户配置文件 /etc/login.defs 简介