java ee_使用Java EE的ManagedExecutorService异步执行事务
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上找到。
翻译自: https://www.javacodegeeks.com/2014/03/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions.html
java ee
java ee_使用Java EE的ManagedExecutorService异步执行事务相关推荐
- java与java ee_使用Java EE的ManagedExecutorService异步执行事务
java与java ee 自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自Java EE诞生以来,缺少的一件事就是能够 ...
- 使用Java EE的ManagedExecutorService异步执行事务
自Java EE 7规范发布以来已经过去了一年. 现在,Wildfly 8 Final已发布,现在是时候仔细看看这些新功能了. 自从Java EE时代开始以来就缺少的一件事是能够使用成熟的Java E ...
- java starling_Java使用starling分布式消息队列异步处理事务
介绍: Starling是一个支持MemCache协议的轻量级持久化服务器.Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台 机器间的异步工作进程.它是著名微博客网站T ...
- java starling_Java使用starling分布式消息队列异步处理事务...
介绍: Starling是一个支持MemCache协议的轻量级持久化服务器.Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台 机器间的异步工作进程.它是著名微博客网站Twi ...
- java与java ee_计划Java EE 7批处理作业
java与java ee Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能. <job id="myJob" xmlns="http://x ...
- java web开发中会遇到的异步执行方案
http://code.google.com/p/asyn4j/wiki/user_guide
- Java并发包-java.util.concurrent详解
转载自https://blog.csdn.net/axi295309066/article/details/65665090 一.阻塞队列BlockingQueue BlockingQueue通常用于 ...
- jakarta ee_适用于Java EE / Jakarta EE开发人员的Micronaut
jakarta ee 城镇中有一个名为Micronaut的新微服务框架. 在本文中,我将从Java EE / Jakarta EE的角度讨论如何冒险使用Micronaut框架. 我是Java EE开发 ...
- java与java ee_RxJava + Java8 + Java EE 7 + Arquillian =幸福
java与java ee 微服务是一种体系结构样式,其中每个服务都实现为一个独立的系统. 他们可以使用自己的持久性系统(尽管不是强制性的),部署,语言等. 由于系统由一个以上的服务组成,因此每个服务将 ...
最新文章
- C和C++安全编码笔记:指针诡计
- LINUX上MYSQL优化三板斧
- SDM管理路由器要进行的相应配置
- Thinkphp下嵌套UEditor富文本WEB编辑器
- java实现WGS84转其他地图坐标
- 课堂练习 5-22 团队如何做决定
- 大数问题(高精度运算)
- P5643-[PKUWC2018]随机游走【min-max容斥,dp】
- 苹果MacBook Air 2018款少量用户会出现主板问题可免费更换
- python处理excel的优势-用Python读写Excel文件的方式比较
- iOS多线程编程--NSOperation(转)
- 运用Python实现猜数字游戏
- 制作芭奇站群软件自定义发布接口命令大全
- 腾讯云如何搭建PHP环境?
- ASP.NET Core WebApi返回结果统一包装实践
- 少儿编程是不是智商税
- java基础零散知识
- 华为手机助手 无法访问服务器,EMUI4.X手机及windowsXP系统无法正常使用华为手机助手问题...
- 提升研发质量的三个办法
- Unity VR开发教程 OpenXR+XR Interaction Toolkit (六)手与物品交互(触摸、抓取)
热门文章
- hdfs日志上传脚本(三)
- JNLP(jar包签名)
- 关于Python正则表达式的问题
- Windows Server AppFabric Caching
- textarea 自适应窗口|IE、firefox 显示同样的效果
- QQ 邮箱的换肤 bug
- python pip 报错 Command “python setup.py egg_info“ failed with error code 1 解决方法
- linux make 命令行 定义宏(-D)传递给C源代码 简介
- java ssh框架 struts spring hibernate 简介
- linux 新建用户配置文件 /etc/login.defs 简介