首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TransactionalEventListener使用场景与原理分析

@TransactionalEventListener注解的方法创建时间监听器代理,在应用启动的时候EventListenerMethodProcessor调用,其原理在另外一片文章《事件驱动编程》也分析过...onApplicationEvent方法,这一段逻辑比较巧妙,首先检查当前上下文是否在事务,如果是则把监听器逻辑注册到事务同步器,等待后续事务执行过程指定节点触发,如果没有在事务则立即触发事件监听逻辑...事件工厂初始化: 事务事件监听器初始化: 2.事务事件调用与监听器触发 在spring体系我们可以直接注入事件发布器来发布事件: @Autowired protected ApplicationEventPublisher...onApplicationEvent方法执行自定义逻辑。...然后调用事件同步管理器把事件同步逻辑注册到事务: public static void registerSynchronization(TransactionSynchronization synchronization

5.1K41
您找到你想要的搜索结果了吗?
是的
没有找到

DDD落地之事件驱动模型

双11结束,这段要代码要被注释。有一年大促,赠送的东西改变,代码又要加回来。。。。 来来回回的,订单逻辑变得又臭又长,注释的代码逻辑很多还不好阅读与理解。...update方法  private boolean changed = false;    // 用来存放所有`观察自己的对象`的引用,以便逐个调用update方法  // 需要注意的是:1.8...void deleteObservers(); //删除所有的观察者 ​ // 循环调用所有的观察者的update方法 public void notifyObservers(); public...亦或是,如果主流程执行出错了,那么我们需要触发一个事件,发送钉钉消息到群里进行线上业务监控,需要在主方法逻辑抛出异常再调用此事件。...为了保持事务一致,在方法上加一个@Transactional即可。 3.2.独立事务 @EventListener作为驱动加载业务分散代码管理还挺好的。

94930

COLA-statemachine事务失效踩坑

监听不起作用的原因无果后,我又仔细检查了StateMachine类when和perform的调用,也都是通过@Autowired的类进行调用的,没有产生AOP的自调用问题。...于是想到可能@Transactional根本没有切到Action方法。...execute我在状态机的使用过程并没有直接调用方法,所以只能是由框架内部调用的。...action变量则是由状态机定义时所赋值的,点击setAction方法,全局只有2个地方使用到了,一个在批量的状态流转的实现类,一个在单个的状态流转的实现类?...,用代理对象进行自身方法调用很可惜,两种方法在当前场景都不适用,因为自调用在COLA框架内部,如果为了解决这个问题去再包装框架就有点大动干戈了。

92111

数据库事务提交后才发送MQ消息解决方案

项目场景: 在项目开发中常常会遇到在一个有数据库操作的方法,发送MQ消息,如果这种情况消息队列效率比较快,就会出现数据库事务还没提交,消息队列已经执行业务,导致不一致问题。...userMapper.insert(user); // 发送消息给MQ sendMQMessage(); } 原因分析 MQ消息消费快于事务提交 解决方案 对于这种情况,下面给出两种处理方法...,一种是借助于Spring框架提供的TransactionSynchronizationManager来控制,另外一种方法是借助于Spring框架提供的@TransactionalEventListener...public void afterCommit() { // 发送消息给MQ sendMQMessage(); } }); } 测试一下...userMapper.insert(user); log.info("save user info"); return user; } } 经过测试

63540

使用 @Autowired 注入成功,GetBean 方法却获取不到?!

之前推文已经讲过 当@Transactional遇到@CacheEvict,你的代码是不是有bug! 现在要在事务提交之后清除缓存。...@TransactionalEventListener 为了方便发送事件,偷懒使用了静态方法: ? publishEven 其中,SpringUtil.getBean()方法的内部实现为: ?...解决的方案也很简单:使用@Autowired注入ApplicationEventPublisher,调用其publishEvent方法。...看过 Spring 源码的小伙伴不知道还记不记得,在refresh()方法,会调用prepareBeanFactory,在该方法,注册了可解析依赖项。 ?...demo 测试结果和ApplicationEventPublisher一样,可以在 Bean 通过@Autowired的方式来注入MySpecificBean,但却无法通过BeanFactory#getBean

1.6K20

简单高效的代码优化-事务后异步处理

,其余多种签收方式均会走到服务提供的接口 涉及多个服务调用,包含后台签收、用户自己签收、定时任务签收、基于轨迹的签收 核心接口慢,导致该服务在诸多调用情况下TP99居高不下,同时使得常用的批量签收有着惊人的超...EventListener,你可以很快速的迁移知识到Spring @TransactionalEventListener 帮助解耦代码,实现事务提交后异步执行分支流程,@TransactionalEventListener...其中的接口即可 如果你研究过@Transactional的原理,那么对事务管理器的处理就并不陌生 在本文中,我们只需要实现afterCommit方法即可,如果在@Transactional的代码存在事务同步器扩展点...,用于后续的撤单、退货等 直接采用@TransactionalEventListener将默认采用单一线程的线程池,同时也不是异步线程,因此需要手动创建出线程池,并加以@Async指定 我们可以指定该方法的执行阶段...,非常的便捷 # 优化效果 本文的性能问题不体现在慢SQL上,所以优化方案并不包含SQL优化处理 同时由于分支流程下游方法的幂等未知性,重构时没有加入分支流程的重试机制,这些方法在重构时都是可以考虑的点

41250

【Spring源码】Spring Event事件

Spring框架的事件是一种观察者设计模式的实现,用于在应用程序处理各种状态变化。事件驱动编程是一种流行的编程范式,其中组件之间的通信是通过事件(或消息)进行的。...publisherEvent()方法推送事件。...Spring里面提供了两种事件订阅的方式: 继承ApplicationListener,并实现onApplicationEvent方法。 使用@EventListener注解方法。...先实现一个测试接口,该接口发布了一个事件,发布完后打印一行日志: @GetMapping("test_audit") public String test_audit(){ DamIllegalDataDto...5、@TransactionalEventListener 提到事件,这里再提一个注解@TransactionalEventListener,也即感知事务,基于事件形式与事务的某个阶段进行绑定。

22310

用JUnit和Byteman测试Spring的异步操作

对于测试,我们将使用Byteman库的功能。我们还必须附加“ Bmunit-extension”库,该库提供了包含JUnit规则和在测试期间使用的一些辅助方法。...没有迹象表明在演示应用程序为Bmunit-extension实施的代码是唯一的方法,甚至是最好的方法。...为此,我们需要通过BMRule注释集,在方法退出后(值“ AT EXIT”的“ targetLocation”选项),需要执行执行“ Helper#joinEnlist(Object key)”方法的某些动作...,该方法不会挂起调用它的当前线程。...在执行testes方法的“when”调用“ BMUnitUtils#joinWait(Object,int,long)”挂起测试线程,以等待连接器“ UserControllerTest.shouldCreateNewUserAndSendMailMessageInAsyncOperation

1.8K10

聊聊spring的TransactionalEventListener

the exact same features as any regular {@link EventListener} annotated method * but is aware of the transactional...TransactionalEventListener信息;其onApplicationEvent方法在有事务的时候会创建并注册transactionSynchronization到当前事务,没有事务若允许...,在afterCompletion方法根据status的值与phase的值的匹配关系决定是否执行processEventTransactionalEventListenerFactoryorg/springframework...type,然后执行processBean,该方法会先收集annotatedMethods,然后遍历该方法,在遍历factories针对支持该方法的factory执行createApplicationListener...只是覆盖了beforeCommit及afterCompletion两个方法,在afterCompletion方法根据status的值与phase的值的匹配关系决定是否执行processEvent,因而这里抛出的异常会被捕获并

22920

聊聊如何在spring事务中正确进行远程调用

可能会导致用户服务的添加逻辑进行回滚 解决耗时过长,有些朋友可能想到可以采用异步的方式,积分抖动异常,可以通过添加熔断机制,比如积分超时没响应,就直接进行熔断 今天我再说一种方案,就是在事务提交后再进行调用...答案有的,通过注解+aop来整合实现,具体实现逻辑,可以查看下面demo链接的 com.github.lybgeek.transactional 我这边就不贴具体代码了,为什么不贴,是因为我要介绍另外一种方案...,就是基于spring的事件驱动实现 通过TransactionalEventListener注解+ApplicationEventPublisher 这是spring的事件驱动实现,或者说是观察者实现方式...,不过TransactionalEventListener注解是spring4.2版本之后才提供的注解 通过这种方式如何改造上面邀请用户,添加积分的实现?...1、在邀请用户注册方法,进行事件发布 伪代码如下 @Transactional(rollbackFor = Exception.class) public Boolean inviteUser

95561

聊聊spring的TransactionalEventListener

TransactionalEventListener信息;其onApplicationEvent方法在有事务的时候会创建并注册transactionSynchronization到当前事务,没有事务若允许...,在afterCompletion方法根据status的值与phase的值的匹配关系决定是否执行processEvent TransactionalEventListenerFactory org/springframework...type,然后执行processBean,该方法会先收集annotatedMethods,然后遍历该方法,在遍历factories针对支持该方法的factory执行createApplicationListener...,添加到context 小结 TransactionalEventListener是EventListener的事务感知版本,默认的是TransactionPhase是AFTER_COMMIT,TransactionSynchronizationEventAdapter...只是覆盖了beforeCommit及afterCompletion两个方法,在afterCompletion方法根据status的值与phase的值的匹配关系决定是否执行processEvent,因而这里抛出的异常会被捕获并

26410

简单高效的代码优化-事务后异步处理

,其余多种签收方式均会走到服务提供的接口 涉及多个服务调用,包含后台签收、用户自己签收、定时任务签收、基于轨迹的签收 核心接口慢,导致该服务在诸多调用情况下TP99居高不下,同时使得常用的批量签收有着惊人的超...50s的阻塞式耗时,签收相关接口长期处在监控耗时Top5 可以显而易见地观察到批量任务50s中有30s都在跑签收 其次,代码上还存在如下典型问题 签收代码逻辑混乱,主流程和次要流程交替出现在代码,校验混合在各种方法内...其中的接口即可 如果你研究过@Transactional的原理,那么对事务管理器的处理就并不陌生 在本文中,我们只需要实现afterCommit方法即可,如果在@Transactional的代码存在事务同步器扩展点...TransactionalEventListener将默认采用单一线程的线程池,同时也不是异步线程,因此需要手动创建出线程池,并加以@Async指定 我们可以指定该方法的执行阶段,这里为TransactionPhase.AFTER_COMMIT...,非常的便捷 # 优化效果 本文的性能问题不体现在慢SQL上,所以优化方案并不包含SQL优化处理 同时由于分支流程下游方法的幂等未知性,重构时没有加入分支流程的重试机制,这些方法在重构时都是可以考虑的点

82821

聊聊如何在spring事务中正确进行远程调用

可能会导致用户服务的添加逻辑进行回滚 解决耗时过长,有些朋友可能想到可以采用异步的方式,积分抖动异常,可以通过添加熔断机制,比如积分超时没响应,就直接进行熔断 今天我再说一种方案,就是在事务提交后再进行调用...答案有的,通过注解+aop来整合实现,具体实现逻辑,可以查看下面demo链接的 com.github.lybgeek.transactional 我这边就不贴具体代码了,为什么不贴,是因为我要介绍另外一种方案...,就是基于spring的事件驱动实现 通过TransactionalEventListener注解+ApplicationEventPublisher 这是spring的事件驱动实现,或者说是观察者实现方式...,不过TransactionalEventListener注解是spring4.2版本之后才提供的注解 通过这种方式如何改造上面邀请用户,添加积分的实现?...01 在邀请用户注册方法,进行事件发布 伪代码如下 @Transactional(rollbackFor = Exception.class) public Boolean inviteUser(

65730

Spring事务监听,为什么会出现事务失效?

首先是 OrderService,createOrder() 方法里保存订单记录,发布“订单已注册”的事件:public class OrderService { @Transactional...,调用一下 orderService.createOrder() 方法,看一下日志打印:Hibernate: insert into order_entity (id, order_no) values...这个方法是在AbstractPlatformTransactionManager.triggerAfterCompletion() 内被调用的:在这里判断了事务的状态,此时我们的事务状态为有事务,但不是一个新事务...问题解决其实明白了问题,解决方案自然也很简单,只需要调整一下事务的传播类型,把保存操作记录的方法,标示为一个新的事务就好了:public class OperationService { @Transactional...而在这一步,才会关闭数据库的连接。你是不是意识到了什么?如果在事务事件监听的同步处理,是个耗时较长的操作,就会一直持有这个数据库连接,线上如果有大量的并发调用,数据库的连接池很容易被耗尽。

1.1K50

深入了解 Spring 的事务(从核心注解和类入手)

* 如果是同一个类调用的话,请采用AdviceMode.ASPECTJ * @return */ AdviceMode mode() default AdviceMode.PROXY...通过源码我们看到,该注解可以出现在接口上,类上和方法上。分别表明: 接口上:当前接口的所有实现类重写接口的方法有事务支持。 类上:当前类中所有方法有事务支持。 方法上:当前方法有事务的支持。...beanFactory) { // 方法的其他代码略 // 初始化剩余单例bean对象.调用的是DefaultListableBeanFactory类的preInstantiateSingletons...方法执行了 afterSingletonsInstantiated() 方法。...3.4.5 在 processBean 方法调用了创建事件监听器的方法 createApplicationListener。该方法是 EventListenerFactory 接口中声明的方法

1.2K30

如何优雅地Spring事务编程

在开发,有时候我们需要对 Spring 事务的生命周期进行监控,比如在事务提交、回滚或挂起时触发特定的逻辑处理。那么如何实现这种定制化操作呢?...} } 在 Spring 事务刚开始的时候,我们向 TransactionSynchronizationManager 事务同步管理器注册了一个事务同步器,事务提交前/后,会遍历执行事务同步器对应的事务同步方法...Spring 创建事务时,DataSourceTransactionManager.doBegin 方法,将新创建的 connection 包装成 connectionHolder ,通过 TransactionSynchronizationManager...#bindResource 方法存入 resources 。...@TransactionalEventListener 在 Spring Framework 4.2版本后还可以使用 @TransactionalEventListener 注解处理数据库事务提交成功后的执行操作

8110
领券