java与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与java ee

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

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

    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并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  4. Java并发编程-并发工具包java.util.concurrent使用指南

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurren ...

  5. Java Web项目中缺少Java EE 6 Libraries怎么添加

    Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...

  6. java.lang.module_如何修复“java.lang.module.FindException:module java.se.ee not found”错误

    我正在尝试打包我的kivy应用程序(python3),但是当我运行命令buildozer -v android debug时,看到这个错误# Cwd /home/javier/.buildozer/a ...

  7. 【Java成王之路】EE初阶第十篇:(网络编程) 4

    上节回顾 套接字,TCP版本的套接字 API ServerSocket 服务器这边使用的 Socket: 服务器和客户端都需要使用 对于服务器来说: 1.创建ServerSocket 关联上一个端口号 ...

  8. Spring Boot 3.0 M1 发布,正式弃用 Java 8,最低要求 Java 17。。。

    一直以来,Java8都是Java社区心头的痛.因为它代表着以稳定性为主的企业管理层,与拥抱变化为主的底层码农层之间的.爱的魔力拉锯战. 不生!少生!成为各大厂心照不宣的选择. 现在,这种平衡或将打破. ...

  9. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

最新文章

  1. 使用jmeter测试java程序
  2. Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
  3. 多个服务器数据互通_3月21日部分服务器数据互通公告!
  4. 你的pyc文件,泄露了你的秘密!
  5. Linux的ext4文件系统学习笔记
  6. hive-内置函数(常用内置函数汇总)
  7. Android挂断、接听电话
  8. Python 工匠: 异常处理的三个好习惯
  9. LSB算法BMP图片信息隐藏技术 c语言
  10. 编程专业人的良好习惯(练习、时间管理、压力、团队协作)
  11. Go:http request cancelled 服务端感知
  12. 加密流量分类-论文2:Deep Packet: A Novel Approach For Encrypted Traffic Classification Using Deep Learning
  13. N-Tiers开发方式(ASP/ASP.NET、VB6/VB.NET呼叫使用COM+组件)
  14. Java 无需解压直接读取ZIP压缩包里的文件及内容
  15. matlab lte rsrp,LTE 下行速率和SINR、RSRP什么关系?
  16. Wireshark抓包及常用过滤方法
  17. 【HTML学习笔记】link标签中的href路径
  18. 动手学深度学习番外篇 01.为什么from d2l import torch as d2l
  19. 2、java的应用领域
  20. JAVA——jdk8的下载与安装,win10下配置JDK环境变量

热门文章

  1. 【做题记录】P4211 [LNOI2014]LCA
  2. 【快速幂】小明解密码 (jzoj 2146)
  3. NOI2021模拟测试赛 解题报告
  4. Spark SQL(六)之加载数据的参数配置
  5. js实现页面跳转重定向的几种方式
  6. Java日期及时间库插件 -- Joda Time.
  7. 晨读,难道只是为了完成任务而读的吗?
  8. ‘小会计’的转行之旅
  9. 初识Windows程序
  10. javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层