vue 侦听器侦听对象属性_Spring中的异步和事务性事件侦听器

vue 侦听器侦听对象属性

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

可以使用事件的示例之一是组件要发信号通知已创建或修改实体 (就JPA而言),以便其他感兴趣的组件(侦听器)可以对此事件做出React并触发一些业务逻辑(例如计划)通知)。 通常,此类代码在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

vue 侦听器侦听对象属性

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

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

相关文章

mac tomcat java_Mac下配置Java开发环境(JDK1.8)和Tomcat服务器

平时做PHP,装的有nginx,mysql这儿就不多说了,可以看前面的相关文章,用的brew配置的,超简单。 今天介绍一下Java相关的配置 Java官网下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 我这儿下载的是Java…

python集合和字典的区别_Python中的字典和集合

导语:本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握常见的字典创建,查询,判别方法; 2、了解字典中的defaultdict、…

Linux 命令之 df -- 显示磁盘空间使用情况

文章目录命令介绍常用选项大小格式参考示例(一)查看系统磁盘设备的使用情况(二)显示指定文件所在分区的磁盘使用情况(三)显示文件类型为ext4的磁盘使用情况命令介绍 df 命令的英文全称即“Disk Free”&…

apache ignite_Apache Ignite本机持久性,简要概述

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

java编程九九乘法表_如何用JAVA语言编写一个九九乘法表

教一下学了JAVA語言的同学们撰写一个99玖玖乘决表方法进行设计构思:假如把99玖玖乘决报表中如“1*11”算式全部当作一个一字的笔画体得话,99玖玖乘决表可当作一个倾斜角二五长方形形,进行倾斜角二五长方形形可用两个for循环系统软件嵌套循环来…

python tkinter 安装_如何为Python安装tkinter?

如果你和我一样,由于你在I.S中的好朋友而在你的网络上没有根目录特权,而且你是在本地安装中工作的,你可能会在上面的方法上遇到一些问题。 我在谷歌上花了很长时间--但最终,这很容易。 要在Linux上本地安装(我将其安装到我的主目录…

Linux 命令之 more -- 显示文本文件内容/显示文件内容/查看文件内容

文章目录一、命令介绍二、常用选项三、命令内部操作快捷键四、参考示例(一)显示文件file的内容,显示之前先清屏,附已显示的百分比(二)显示文件file的内容,每10行显示一次,而且在显示…

java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索

java jigsawJava 9由于Jigsaw项目而延迟了很多次,您可能会听到很多关于模块,模块化和其他内容的信息,那么,这到底是什么呢? 什么是模块化,模块化平台是什么意思? Java平台模块系统(J…

java conf_JAVA 解析、编辑nginx.conf详解

最近工程开发遇到一个需求:用Java去解析并编辑nginx.conf解析nginx.conf过程可以参考该项目的README.md下面举个列子说明一下该如何编辑nginx.conf。定义一个pojoimportcom.alibaba.fastjson.JSONArray;importcom.google.common.base.Strings;importlombok.Data;Dat…

mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务。经过排查后,确定原因是:SQL在执行时,MySQL优化器选择了错误的索引(不应该说是“错误”,而是选择了实际执行耗时更长的索引)。排查过程中&#xff0c…

Linux 命令之 head -- 在屏幕上显示指定文件的开头若干行/显示文件开头内容/查看文件开头内容

文章目录命令介绍常用选项参考示例(一)显示前 3 行文件内容(二)显示文件名信息,并显示文件前两行(三)显示文件前5个字符命令介绍 head 命令用于显示文件的开头的内容。在默认情况下&#xff0c…

java登录界面命令_Java命令行界面(第25部分):JCommando

java登录界面命令JCommando 网站 上将JCommando描述为“命令行参数的Java参数解析器”。 JCommando读取XML配置以生成一个Java类,该类处理Java应用程序中的解析。 在提供XML配置的 Java命令行解析库的本系列文章中,以前涵盖的唯一基于Java的库是JSAP &am…

数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...

【新智元导读】击败卡斯帕罗夫的「深蓝」并不是真正的人工智能,它过度依赖了人类设计的规则,而最近DeepMind的一项深度强化学习新研究表明,不用人工介入,完全数据驱动,算法自己就能发现算法。「深蓝」并非以智取胜&…

Linux 命令之 tail -- 在屏幕上显示指定文件的末尾若干行/显示文件尾部内容/查看文件尾部内容

文章目录一、命令介绍二、常用选项三、参考示例(一)显示文件 file 的最后 10 行(二)显示文件 file 的内容,从第 20 行至文件末尾(三)显示文件file的最后10个字符(四)显示…

python的循环语句机制_Python-for循环的内部机制

Python中,使用for循环可以迭代容器对象中的元素,这里容器对象包括是列表(list)、元组(tuple)、字典(dict)、集合(set)等。但是,为什么这些对象可以使用for循环进行操作呢?首先,定义一个简单的类尝试一下:cl…

迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答

迈克尔 杰克逊mv在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流。 这次让我们看一个大的JSON文件。 我们的示例将基于微小的colors.json,其中包含将近150种这种格式的记录: {"aliceblue": [240, 248, 255, …

@cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?

现代的消息队列,都使用磁盘文件来存储消息。因为磁盘是一个持久化的存储,即使服务器掉电也不会丢失数据。绝大多数用于生产系统的服务器,都会使用多块儿磁盘组成磁盘阵列,这样不仅服务器掉电不会丢失数据,即使其中的一…

Linux 启动/停止/重启 SSH 进程,以及查看 SSH 进程状态的命令

请参考文章《Linux 启动/重启/关闭 MySQL 数据库的命令》

g++ 安装python_以后再也不用“教程”:让人举一反三的python配置环境过程 + 超简单原理概括!...

前言: 前一阵子至少指导了5位学弟学妹小伙伴配置 python 环境。两年前我入门 python 时,也得照着互联网上的资料,一步一步“照猫画虎”;为什么现在自己可以“凭感觉”一气呵成了呢?我想,原因必然是自己对于…

MacBook/MacOS/Mac OS 关于启动/停止/重启服务(进程/程序)的命令

文章目录使用命令 launchctl 停止某个进程使用命令 launchctl 启动某个进程使用命令 launchctl 查看某个进程是否启动使用命令 launchctl 停止某个进程 liaowenongdeair:bin root# sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist说明: .plist …