spring3.0异步

介绍

如您可能已经知道的(例如,从我以前的博客文章中 ),不再需要创建一个单独的类来实现带有onApplicationEvent方法的ApplicationListener ,以便能够对应用程序事件做出响应(包括来自Spring Framework本身和我们自己的域事件)。 从Spring 4.2开始,添加了对注释驱动的事件侦听器的支持。 在方法级别使用@EventListener就足够了,它会在@EventListener自动注册相应的ApplicationListener

@EventListenerpublic void blogAdded(BlogAddedEvent blogAddedEvent) {externalNotificationSender.blogAdded(blogAddedEvent);}

请注意 ,在事件中使用域对象有明显的缺点,在许多情况下也不是最好的主意。 代码示例中的伪域对象用于不引入不必要的复杂性。

交易绑定事件

简单紧凑。 对于“标准”事件,一切看起来都很不错,但在某些情况下,需要在事务提交(或回滚)之后执行一些操作(通常是异步操作)。 那是什么 是否可以使用新机制?

业务需求

首先,是一个小题外话-业务需求。 让我们想象一下超级精美的博客聚合服务。 每次添加新博客时都会生成一个事件。 订阅的用户可以接收SMS或推送通知。 可以在将博客对象计划保存在数据库中之后发布该事件。 但是,在提交/刷新失败(违反数据库约束,ID生成器出现问题等)的情况下,整个数据库事务都会回滚。 许多愤怒的用户,带有不完整的通知,将出现在门口……

技术问题

在现代的事务管理方法中,事务是声明式配置的(例如,使用@Transactional批注),并且在事务作用域的结尾(例如,方法的结尾)触发提交。 总的来说,这非常方便,而且出错的可能性要小得多(与编程方法相比)。 另一方面,提交(或回滚)是在代码外自动完成的,因此我们无法以“经典方式”做出React(即在调用transaction.commit()之后的下一行中的publish事件)。

老学校实施

不可或缺的Tomek Nurkiewicz提出了Spring的一种可能的解决方案(也是一种非常优雅的解决方案)。 它使用TransactionSynchronizationManager来注册当前线程的事务同步。 例如:

@EventListenerpublic void blogAddedTransactionalOldSchool(BlogAddedEvent blogAddedEvent) {//Note: *Old school* transaction handling before Spring 4.2 - broken in not transactional contextTransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {internalSendBlogAddedNotification(blogAddedEvent);}});}

所传递的代码在Spring事务工作流中的适当位置执行(对于这种情况,“恰好”在提交之后)。

为了提供对非事务上下文中执行的支持(例如,在不关心事务的集成测试用例中),可以将其扩展为以下形式,以确保不会因java.lang.IllegalStateException: Transaction synchronization is not active而失败java.lang.IllegalStateException: Transaction synchronization is not active异常:

@EventListenerpublic void blogAddedTransactionalOldSchool(final BlogAddedEvent blogAddedEvent) {//Note: *Old school* transaction handling before Spring 4.2//"if" to not fail with "java.lang.IllegalStateException: Transaction synchronization is not active"if (TransactionSynchronizationManager.isActualTransactionActive()) {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {internalSendBlogAddedNotification(blogAddedEvent);}});} else {log.warn("No active transaction found. Sending notification immediately.");externalNotificationSender.newBlogTransactionalOldSchool(blogAddedEvent);}}

在缺少活动事务的情况下,通过进行此更改,可以立即执行提供的代码。 到目前为止,一切正常,但让我们尝试在Spring 4.2中使用注释驱动的事件侦听器实现相同的目的。

Spring 4.2+实施

除了@EventListener之外,Spring 4.2还提供了另一个注解@TransactionalEventListener

@TransactionalEventListenerpublic void blogAddedTransactional(BlogAddedEvent blogAddedEvent) {externalNotificationSender.newBlogTransactional(blogAddedEvent);}

执行可以绑定到标准事务阶段:提交之前/之后,回滚之后或完成之后(提交或回滚)。 默认情况下,只有在事件的边界内发布事件时,它才会处理事件。 在其他情况下,该事件将被丢弃。

为了支持在非事务上下文中的执行,可以使用falbackExecution标志。 如果设置为“ true”,则如果没有事务在运行,则将立即处理事件。

@TransactionalEventListener(fallbackExecution = true)public void blogAddedTransactional(BlogAddedEvent blogAddedEvent) {externalNotificationSender.newBlogTransactional(blogAddedEvent);}

摘要

在Spring 4.2中引入的注释驱动的事件侦听器延续了减少基于Spring(Boot)的应用程序中样板代码的趋势。 无需手动创建ApplicationListener实现,无需直接使用TransactionSynchronizationManager只需一个具有正确配置的注释即可。 硬币的另一面是,要找到所有事件侦听器会有些困难,尤其是在我们的整体应用程序中有数十个事件侦听器的情况下(尽管可以很容易地对其进行分组)。 当然,新方法只是在给定用例中有用或没有用的一种选择。 尽管如此,Spring(Boot)的另一个魔力泛滥到了我们的系统中。 但是也许抵抗是徒劳的?

抵抗是徒劳的吗?
资料来源: http : //en.memory-alpha.wikia.com/wiki/Borg_cube

请注意,Spring Framework 4.2是Spring Boot 1.3的默认依赖项(在编写1.3.0.M5时可用)。 另外,可以在Gradle / Maven中为Spring Boot 1.2.5手动升级Spring Framework版本–在大多数情况下应该可以使用。

  • 可以从GitHub获得代码示例。

顺便说一句,为该博客文章编写示例使我有了使用Spring 4.1中引入的新测试事务管理系统的第一种真正能力(过去,我仅在Spring培训课程中提到过它)。 可能,我会尽快写更多有关它的内容。

翻译自: https://www.javacodegeeks.com/2015/10/simpler-handling-of-asynchronous-transaction-bound-events-in-spring-4-2.html

spring3.0异步

spring3.0异步_在Spring 4.2中更简单地处理异步事务绑定事件相关推荐

  1. 在Spring 4.2中更简单地处理异步事务绑定事件

    介绍 如您可能已经知道的(例如,从我以前的博客文章中 ),不再需要创建一个单独的类,该类使用onApplicationEvent方法实现ApplicationListener以便能够对应用程序事件做出 ...

  2. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  3. spring自动装配依赖包_解决Spring自动装配中的循环依赖

    spring自动装配依赖包 我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践. 使用Spring编写企业Web应用程序时,服务层中的服务量可能会增加. 服务层中的每个服务可能会消耗其他服 ...

  4. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略

    作者:hymanzhang,腾讯 IEG 运营开发工程师 背景 部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发.在设计时打算采用 kafka 消息队列进行业务 ...

  5. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清

    为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...

  6. java中的 请求体_在spring mvc test中访问请求体和请求头

    我创建了一个spring boot应用程序,这就是我的控制器的样子 . 我使用postman在请求体中发送json,在请求头中发送一个字符串,然后进一步散列json并将其与请求头获取的字符串进行比较 ...

  7. hql 查询关联对象_在spring data jpa中如何做报表统计查询?

    问题描述 之前有个简单的报表统计需求,如果用sql的话是比较简单的,但是基于spring data jpa还没有遇到好的解决方案,折腾半天用spring data提供的几种方式都不能解决,spring ...

  8. java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件

    java中什么时候应用异常 Pareto记录原理:97%的记录错误语句是由3%的唯一错误引起的 在最新的数据整理帖子之后,我们收到了很多反馈和问题,我们发现97%的记录错误是由10个唯一错误引起的 . ...

  9. linux c 贝塞尔曲线_使用 logzero 在 Python 中进行简单日志记录 | Linux 中国

    快速了解一个方便的日志库,来帮助你掌握这个重要的编程概念.-- Ben Nuttall logzero 库使日志记录就像打印语句一样容易,是简单性的杰出代表.我不确定 logzero 的名称是否要与 ...

最新文章

  1. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介
  2. UNITY 中List.Sort的BUG
  3. POJ2411-Mondriaan's Dream【状态压缩dp】
  4. 有源蜂鸣器和无源蜂鸣器的区别_电磁式蜂鸣器和压电式蜂鸣器的区别以及驱动方法...
  5. java oracle数据库连接代码,java连接oracle数据库代码实例(注释详解)
  6. 因为造轮子,我一个月就转正了 | 原力计划
  7. android中的weight
  8. SAPUI5入门到精通5---MVC和数据绑定
  9. SPSS配对样本t检验
  10. OC 5028B欧创芯原装,开关降压型大功率恒流驱动芯片
  11. Seaborn 绘图中设置字体及大小
  12. linux把ftp挂载成盘符,使用curlftpfs将ftp空间挂载到本地
  13. Photoshop序列号
  14. iOS Swift 使用 CLLocationManager 定位
  15. win10 RTX30系列显卡 安装tensorflow-gpu 1.15
  16. 信息学奥赛一本通:1125:矩阵乘法
  17. 罗伯特扫地机器人电池如何取_周末清洁大会战 篇二十三:更换电池和清扫让iRobot 880扫地机器人焕然一新,还有更多配件来凑热闹...
  18. 实现仿百度图片查看功能(点击缩略图放大效果)
  19. linux 星际争霸,让星际争霸在Linux下转起来
  20. Android项目总结之社会化分享

热门文章

  1. YbtOJ-大收藏家【分层图,最大流】
  2. P4492-[HAOI2018]苹果树【dp】
  3. jzoj5365-[GDOI2018模拟9.14]通信【线段树合并】
  4. P3287-[SCOI2014]方伯伯的玉米田【二维树状数组,dp】
  5. 亿些模板【数论数学】
  6. 【2018.3.17】模拟赛之一-ssl2574jzoj1368 无限序列【斐波那契数列】
  7. 【dfs】通行证(jzoj 2013)
  8. 三元环计数四元环计数
  9. SpringBoot集成Flowable
  10. Jdk1.8 JUC源码增量解析(1)-atomic-Striped64