`
somefuture
  • 浏览: 1089729 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 事务提交成功事件监听

 
阅读更多

现在微服务做得越来越多了,头就越来月疼了。

跨系统事务和跨系统分页是最头疼的(其实头疼也没用,解决不了的问题)

 

现在有这么个需求(其实同样的需求见到不少了,一直没解决):

向数据库插入记录,并把数据发MQ给其他系统消费。

其他系统接收到消息后会调用查询接口回来查询更多信息。

可是这个时候可能插入记录的事务都还没提交,所以根本查询不到。

 

通常的做法是延迟消费(或者延迟发送):

比如假设事务在几分钟内一定会提交,那就延后10分钟后再过去查询。

查询到了就可以了。

查询不到就任务之前的事务回滚了。。

 

其实这个场景如果在spring环境下,有两种解决方案:

一种是使用JMS,spring在其中提供了事务支持。

但是如果你本来没用jms,这样改造会比较重。

另一种方法是事件监听。

我们说一下这种方法。

 

 假设老式的延迟发送代码如下:

    @Transactional(rollbackFor = Exception.class)
    public boolean insertSelectiveHeader(SupplierBillPO header) {
   ....
        int i = billPOMapper.insertSelective(header);
//延迟发送mq消息
        service.delaySendMQ(header);
        return i > 0;
    }

 

 

改造后我们不再使用发送mq的service服务,而是用

org.springframework.context.ApplicationEventPublisher;
    
    @Autowired
    private ApplicationEventPublisher publisher;

 发送代码改成发送事件:

    @Transactional(rollbackFor = Exception.class)
    public int insertSelectiveHeader(SupplierBillPO header) {
    ....
        int i = billPOMapper.insertSelective(header);
        publisher.publishEvent(header);
        return i;
    }

 publishEvent的入参可以是任何自定义对象。

 

然后去建一个Bean类:

@Component
public class TransactionalMessageListener {
    
    @TransactionalEventListener(fallbackExecution = true)
    public void handleSupplierBillPush(SupplierBillPO data){
        service.sendImmediately(data);
    }
}

 这个类首先要是一个bean,不然没有人去监听我们的事件啊。

然后里面的方法要用

import org.springframework.transaction.event.TransactionalEventListener;

 做注解。

方法不要有返回值

方法的入参和上面发布事件的入参要一样。

这样spring在事务成功提交后就会调用这个方法了。

我们可以在里面注入其他服务,比如立即发送MQ(现在不用延迟了)

 

其实这个注解有其他配置的,有兴趣的可以研究一下

2
0
分享到:
评论

相关推荐

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    在配置文件中,需要配置Spring的ApplicationContextListener监听器,以便在Web应用启动时加载Spring容器,同时还需要配置Struts2的Spring插件,使得Struts2能够识别Spring管理的bean。 总结,Ibatis通过其灵活的...

    Spring事务事件监控的实现

    此外,Spring事务事件监听器的实现基于Spring的AOP(面向切面编程)机制,它会在事务生命周期的不同点动态地插入代码。Spring通过代理模式来实现这一点,它可以拦截事务方法的调用并在合适的时候执行监听器方法。 ...

    第五章:Spring AOP 在 Spring Framework 内部应用1

    接下来,我们深入到Spring AOP在Spring事务(Transactions)的应用。Spring提供了强大的事务管理机制,包括@EnableTransactionManagement注解来启用事务管理,以及@Transactional注解用于标记需要进行事务控制的方法...

    25个经典的Spring面试问题包含答案

    Spring支持事件驱动编程,允许应用组件通过发布和监听事件进行通信,增强了组件间的松耦合。 15. **Spring中如何实现单例Bean?** 默认情况下,Spring容器会为每个Bean创建一个实例,若需实现单例,只需在XML配置...

    Spring Batch in Action英文pdf版

    通过使用Spring Batch提供的事务管理功能,开发者可以确保作业的每个步骤都能够正确回滚或提交,以及在发生错误时进行重试。 知识点七:实现健壮的作业 为了确保批处理作业的稳定性和可靠性,Spring Batch提供了...

    Spring1.2api参考手册.zip

    11. **事件监听**:Spring 1.2支持事件监听机制,应用上下文中的Bean可以发布和监听自定义事件,增强了组件之间的通信能力。 综上所述,《Spring 1.2 API 参考手册》详细介绍了Spring框架在1.2版本中的各项功能和...

    Spring开发jar包

    - Spring支持发布和监听事件,通过ApplicationEvent和ApplicationListener接口,可以实现应用内部的事件通信。 8. **Spring的MVC框架**: - Spring MVC是Spring框架的一个模块,用于构建Web应用程序,提供了模型-...

    spring-kafka 整合官方文档

    具体包括配置主题、发送消息、KafkaTemplate的使用、事务处理、回复式Kafka模板的创建、接收消息、消息监听器的使用、消息监听器容器的配置和管理、使用@KafkaListener注解、容器线程命名、类级别的@KafkaListener、...

    Spring源码

    在Spring的事务管理方面,`PlatformTransactionManager`是核心接口,提供了事务的开始、提交、回滚等操作。Spring支持编程式事务管理和声明式事务管理,后者通过`@Transactional`注解实现,更加便捷。 最后,Spring...

    spring-mq完美整合示例

    当事务提交时,消息会被发送;如果事务回滚,消息则不会被发送。 7. **异常处理**:在实际应用中,我们需要处理可能出现的网络异常、消息格式错误等问题。Spring的异常处理机制可以帮助我们优雅地处理这些问题,...

    spring 2. 技术手册源代码 前六章

    你可以通过CH04了解如何发布和监听Spring事件。 9. **单元测试与Mock对象**: Spring提供了测试支持,包括JUnit集成和Mock对象,使得测试Spring应用变得更加简单。这部分可能讲解了如何编写和运行单元测试。 10. ...

    springboot整合spring batch

    Spring Batch还提供了强大的错误处理机制,如跳过错误记录、恢复失败的步骤,以及通过`StepExecutionListener`和`JobExecutionListener`进行自定义事件监听。这些功能使得批处理任务更具健壮性。 在Spring Boot应用...

    Java模拟的spring实现

    总结起来,模拟Spring的实现是一个深度学习Spring框架的过程,它涵盖了依赖注入、面向切面编程、事件机制、事务管理和组件扫描等多个核心部分。这样的实践项目可以帮助我们更好地理解和运用Spring框架,并且可以作为...

    Spring 2.5 TestContext

    总结来说,Spring 2.5 TestContext框架为Spring应用的测试提供了强大而灵活的工具,它通过注解驱动的测试配置、事务管理、依赖注入以及测试监听器等功能,帮助开发者编写高效、可靠的测试代码。对于任何使用Spring的...

    spring+MQ消息队列

    6. **事务和持久化**:Spring和ActiveMQ结合可以支持事务性的消息发送,确保消息在事务成功提交后才真正发送。同时,ActiveMQ提供持久化机制,即使在服务器宕机后,未消费的消息也能恢复。 7. **性能优化**:...

    spring集成redis源代码

    你可以定义监听器接口,Spring Data Redis会自动将接收到的消息转换为对应的方法调用。 8. **Redis配置** 在Spring Boot应用中,可以通过`application.properties`或`application.yml`配置Redis的相关参数,如`...

    Spring整合JPA

    Spring提供了声明式事务管理,只需在Service层的方法上添加`@Transactional`注解,Spring就会自动管理事务的开始、提交或回滚。 8. **自定义查询** 虽然Spring Data JPA提供了很多默认的查询方法,但有时我们需要...

    spring+jms+jta事务的消息发送和消息消费

    配置`Atomikos`或`Bitronix`这样的JTA事务管理器,可以实现对JMS和数据库操作的两阶段提交(2PC)协议,确保所有参与的资源要么全部完成事务,要么全部回滚。 在压缩包文件"shanhy-springjms"中,可能包含了以下...

    spring-data-redis

    在开始事务后,可以连续执行多个操作,最后通过Exec提交事务,如果中间有任何操作失败,所有操作都会回滚。 七、发布/订阅 Spring Data Redis提供了Publisher和Subscriber接口,用于实现Redis的发布/订阅功能。...

Global site tag (gtag.js) - Google Analytics