Spring中的异步和事务性事件侦听器

内置的事件发布功能从Spring的早期版本开始存在,对于处理同一应用程序上下文中Spring组件之间的基本通信仍然有用。 通常,应用程序可以生成应用程序事件(可以是任意对象)并侦听它们。 整个机制非常简单:使用ApplicationPublisher发布事件,使用EventListener处理EventListener 。 我发现特别有用的是异步和事务性事件侦听器

可以使用事件的示例之一是组件要发信号通知已创建或修改实体 (就JPA而言),以便其他感兴趣的组件(侦听器)可以对此事件做出反应并触发一些业务逻辑(例如计划)通知)。 通常,此类代码在Spring托管的事务中执行。 例如:

@Service
public class TaskService {private static final Logger LOG = LoggerFactory.getLogger(TaskService.class);@Autowiredprivate TaskRepository taskRepository;@Autowiredprivate ApplicationEventPublisher eventPublisher;public Task createTask(String name) {Task task = new Task();task.setName(name);task.setCreated(LocalDateTime.now());LOG.info("Publishing task created event: {}", task);eventPublisher.publishEvent(new TaskCreatedEvent(task));try {return taskRepository.save(task);} finally {LOG.info("Event published. Saving task: {}", task);}}
}

上面的服务在实际保存事件之前发布带有任务实例的事件。 在Spring中,可以通过多种方式处理此类事件。 为了演示任务实例会发生什么,我将使用JPA EntityManager检查其状态:

  • 如果是暂时的(未设置ID),
  • 如果是由实体经理管理的,或者
  • 如果已分离(不是临时的,不是托管的,但是存在)。

让我们看一下监听器:

@Service
public class TaskCreatedEventListener {private static final Logger LOG = LoggerFactory.getLogger(TaskCreatedEventListener.class);@ResourceEntityManager entityManager;// @Async// @EventListener// @TransactionalEventListenerpublic void handleEvent(TaskCreatedEvent taskCreatedEvent) throws InterruptedException {Task task = taskCreatedEvent.getTask();LOG.info("Is task transient? {}", isTransient(task));LOG.info("Is task managed? {}", isManaged(task));LOG.info("Is task detached? {}", isDetached(task));}private boolean isTransient(Task task) {return task.getId() == null;}private boolean isManaged(Task task) {return entityManager.contains(task);}private boolean isDetached(Task task) {return !isTransient(task)&& !isManaged(task)&& exists(task);}private boolean exists(Task task) {return entityManager.find(Task.class, task.getId()) != null;}}

让我们来看几个例子。 如果我们有以下行为:

  • @EventListener

这是同步调用的标准侦听器。 该方法将在事务完成之前执行,因此对象将处于过渡状态。

  • @Async @EventListener

@Async添加到@EventListener将使该方法异步执行,因此在不同线程中运行(请不要忘记在应用程序中启用异步方法执行)。 在我们的场景中,对象很可能处于过渡状态,但在现实生活中,由于发布者已经可以保存任务,因此也可以将其拆离 。 因此,实际上,行为不是确定性的。

  • @TransactionalEventListener

当将侦听器标记为事务性事件侦听器时,Spring仅在事务及其后提交阶段(可以通过注释对其进行调整)的边界中调用发布者时才将事件发布给侦听器。 在这种情况下,对象将处于托管状态。

  • @Async @TransactionalEventListener

这是最有趣的情况。 如上所述,Spring仅在事务边界及其提交后阶段中调用发布者时才将事件发布给侦听器,但是事务完成了,因此对象处于分离状态–正在运行另一个事务。

翻译自: https://www.javacodegeeks.com/2017/10/asynchrouns-transactional-event-listeners-spring.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 canvas获取坐标,HTML5 canvas坐标

在canvas当中有一个特殊的东西叫做“坐标”!没错,就是平时所熟知的坐标体系。canvas拥有自己的坐标体系,从最上角0, 0开始,X向右是增大,Y向下是增大。也可以借助CSS当中的盒子模型的概念来帮助理解。尽管canvas元素功能…

linux u盘 慢_u盘加载较慢 建议优化 - 卡饭网

U盘加载速度十分缓慢的原因及解决方法U盘加载速度十分缓慢的原因及解决方法 很多朋友在使用U盘的时候都遇到过电脑接入U盘后,加载读取文件的速度十分的缓慢,总是要等上一段时间才能完全读取,这是怎么回事呢?该怎么处理&#xff1f…

Java命令行界面(第21部分):航空公司2

本系列文章的第21篇关于Java中解析命令行参数的文章的重点是Airline 2库。 Airline 2的GitHub项目页面描述了该库,“ Airline是一个Java库,提供了基于注释的框架来解析命令行界面。” 该页面进入状态:航空公司“既支持简单的单个命令&#xf…

android中进度条的使用,android的进度条使用

android的进度条1、实现的效果2、布局代码先写一个my_browser.xml文件 存放WebViewandroid:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/webView"android:layout_w…

taro 重新加载小程序_Taro开发微信小程序的初体验

了解Taro听说Taro是从几个星期前开始的,在一次饭桌上,一个小伙伴说:“Hey, 你听说了Taro么,听说只需要写一套程序就可以生成H5,小程序以及RN的代码模板,并且类似于React的语法。”“哦&#xff…

应用服务器web服务器_最受欢迎的应用服务器

应用服务器web服务器这是本系列的第二篇文章,我们将发布有关Java安装的统计数据。 使用的数据集来自免费的Plumbr安装,在过去六个月中,我们总共收集了1,024个不同的环境。 该系列的第一篇文章分析了基础-运行JVM的操作系统,是32位…

python 类中定义列表_Python-从类定义中的列表理解访问类变量

小编典典类范围和列表,集合或字典的理解以及生成器表达式不混合。为什么;或者,官方用词在Python 3中,为列表理解赋予了它们自己的适当范围(本地名称空间),以防止其局部变量渗入周围的范围内(即使在理解范围之后&#x…

mvc html 生成图片,asp.net mvc5 cs代码中获取视图生成后的HTML

public static class ViewExtensions { /// /// 在控制器内获取指定视图生成后的HTML /// /// 当前控制器的上下文 /// 视图名称 /// 视图所需要的参数 /// 视图生成的HTML public static string GetViewHtml(this ControllerContext context, string viewName, Object param) …

如何在Java 8中将Lambda表达式转换为方法引用?

如果您使用Java 8进行编码,那么您会知道使用方法引用代替lambda表达式会使您的代码更具可读性,因此建议尽可能使用方法引用替换lambda表达式,但是,最大的问题是,您如何查找是否可以用方法引用替换lambda? 是…

最大化窗口设置_打开表格总是默认窗口最小化?适用Word、PPT等其他应用

今天有小哥哥说每天早上上班打开第一个表格时,这样显示;打开第二个表时是这样显示;每次打开第二个表后点最大化再打开其他的表才正常显示为最大化的状态。其实,这只是表格的默认打开方式改变了,我们改正过来就好了。在…

html5块元素代码,html5 区块与内联div 与span html块级元素(示例代码)

HTML 和 可以通过 和 将 HTML 元素组合起来。HTML 块元素大多数 HTML 元素被定义为块级元素或内联元素。编者注:"块级元素"译为 block level element,"内联元素"译为 inline element。块级元素在浏览器显示时,通常会以新…

js 加总数组中某一列_JS数组求和的常用方法实例小结

本文实例总结了JS数组求和的常用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;js数组求和的方法var array [1, 2, 3, 4, 5];var sum 0;1.for循环for (let i 0; i < array.length; i) {sum array[i];}console.log(sum)运行结果sum为 15&#xff0c;如下图…

html页面js遍历listview,javascript实现的listview效果

javascript实现的listview效果更新时间&#xff1a;2007年04月28日 00:00:00 作者&#xff1a;#oContainer {width: 600px;height: 500px;border: 1px solid menu;margin: 0px;padding: 0px;overflow: hidden;}a {color: black;text-decoration: none;}a:hover {color: red;t…

华南x79主板u盘装系统教程_华南x99主板装win7系统及BIOS设置教程

[文章导读]最近有小伙伴问我华南x99主板能装win7吗&#xff1f;华南x99主板可以安装win7&#xff0c;但安装win7过程中有很多问题&#xff0c;要采用win7新机型安装&#xff0c;且要在BIOS中关闭“安全启动”和开启"兼容模式"选择&#xff0c;如果是NVME接口的固态硬…

html按钮返回上一步操作,用js实现返回上一步操作

按钮式&#xff1a;onClick"location.hrefhttp://www.ddhbb.com/">链接式&#xff1a;href"javascript:history.go(-1)">返回上一步href"">返回上一步直接跳转式&#xff1a;开新窗口&#xff1a;onClick"window.open(http://www.…

Apache Ignite本机持久性,简要概述

通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;处理使用传统旋转磁盘引起的问题的需求就消失了。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还有一个缺点…

cheetah的中文_cheetah是什么意思_cheetah的翻译_音标_读音_用法_例句_爱词霸在线词典...

全部非洲猎豹One economist talks hopefully of the " cheetah generation " taking over from the " hippos ".有一位经济学者满怀希望地讲道,肯尼亚的年轻人是征服了 “ 河马一族 ” 的 “ 猎豹一代 ”.期刊摘选The fastest animal on land is the cheet…

计算机减法英语,英语加减乘除的表达

1. 加: “一加二等于三”可以这样表达One plus two is three.One plus two makes three.One plus two equals three.One and two are three.One and two make three.One and two equal three.2. 减: “八减四等于四” 可以这样表达Eight minus four is four.Eight minus four m…

Java命令行界面(第23部分):Rop

Rop库在其主页上被描述为“用Java编写的轻量级命令行选项解析器”。 Rop的“简介”还指出&#xff1a;“ Rop的设计目的是最小化同时方便&#xff0c;并涵盖了大多数常见的命令行解析用例。” 这篇文章是本系列中第23篇有关解析Java命令行参数的文章 &#xff0c;重点是Rop。 …

80端口请求太多超时 php_apmserver 80端口老是被占用问题解决

apmserver 80端口老是被占用问题解决1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等.这里主要是用到windows下的DOS工具,点击”开始”–“运行”,输入”cmd”后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:>netstat -aon | findstr “80”Proto…