现在微服务做得越来越多了,头就越来月疼了。
跨系统事务和跨系统分页是最头疼的(其实头疼也没用,解决不了的问题)
现在有这么个需求(其实同样的需求见到不少了,一直没解决):
向数据库插入记录,并把数据发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(现在不用延迟了)
其实这个注解有其他配置的,有兴趣的可以研究一下
相关推荐
在配置文件中,需要配置Spring的ApplicationContextListener监听器,以便在Web应用启动时加载Spring容器,同时还需要配置Struts2的Spring插件,使得Struts2能够识别Spring管理的bean。 总结,Ibatis通过其灵活的...
此外,Spring事务事件监听器的实现基于Spring的AOP(面向切面编程)机制,它会在事务生命周期的不同点动态地插入代码。Spring通过代理模式来实现这一点,它可以拦截事务方法的调用并在合适的时候执行监听器方法。 ...
接下来,我们深入到Spring AOP在Spring事务(Transactions)的应用。Spring提供了强大的事务管理机制,包括@EnableTransactionManagement注解来启用事务管理,以及@Transactional注解用于标记需要进行事务控制的方法...
Spring支持事件驱动编程,允许应用组件通过发布和监听事件进行通信,增强了组件间的松耦合。 15. **Spring中如何实现单例Bean?** 默认情况下,Spring容器会为每个Bean创建一个实例,若需实现单例,只需在XML配置...
通过使用Spring Batch提供的事务管理功能,开发者可以确保作业的每个步骤都能够正确回滚或提交,以及在发生错误时进行重试。 知识点七:实现健壮的作业 为了确保批处理作业的稳定性和可靠性,Spring Batch提供了...
11. **事件监听**:Spring 1.2支持事件监听机制,应用上下文中的Bean可以发布和监听自定义事件,增强了组件之间的通信能力。 综上所述,《Spring 1.2 API 参考手册》详细介绍了Spring框架在1.2版本中的各项功能和...
- Spring支持发布和监听事件,通过ApplicationEvent和ApplicationListener接口,可以实现应用内部的事件通信。 8. **Spring的MVC框架**: - Spring MVC是Spring框架的一个模块,用于构建Web应用程序,提供了模型-...
具体包括配置主题、发送消息、KafkaTemplate的使用、事务处理、回复式Kafka模板的创建、接收消息、消息监听器的使用、消息监听器容器的配置和管理、使用@KafkaListener注解、容器线程命名、类级别的@KafkaListener、...
在Spring的事务管理方面,`PlatformTransactionManager`是核心接口,提供了事务的开始、提交、回滚等操作。Spring支持编程式事务管理和声明式事务管理,后者通过`@Transactional`注解实现,更加便捷。 最后,Spring...
当事务提交时,消息会被发送;如果事务回滚,消息则不会被发送。 7. **异常处理**:在实际应用中,我们需要处理可能出现的网络异常、消息格式错误等问题。Spring的异常处理机制可以帮助我们优雅地处理这些问题,...
你可以通过CH04了解如何发布和监听Spring事件。 9. **单元测试与Mock对象**: Spring提供了测试支持,包括JUnit集成和Mock对象,使得测试Spring应用变得更加简单。这部分可能讲解了如何编写和运行单元测试。 10. ...
Spring Batch还提供了强大的错误处理机制,如跳过错误记录、恢复失败的步骤,以及通过`StepExecutionListener`和`JobExecutionListener`进行自定义事件监听。这些功能使得批处理任务更具健壮性。 在Spring Boot应用...
总结起来,模拟Spring的实现是一个深度学习Spring框架的过程,它涵盖了依赖注入、面向切面编程、事件机制、事务管理和组件扫描等多个核心部分。这样的实践项目可以帮助我们更好地理解和运用Spring框架,并且可以作为...
总结来说,Spring 2.5 TestContext框架为Spring应用的测试提供了强大而灵活的工具,它通过注解驱动的测试配置、事务管理、依赖注入以及测试监听器等功能,帮助开发者编写高效、可靠的测试代码。对于任何使用Spring的...
6. **事务和持久化**:Spring和ActiveMQ结合可以支持事务性的消息发送,确保消息在事务成功提交后才真正发送。同时,ActiveMQ提供持久化机制,即使在服务器宕机后,未消费的消息也能恢复。 7. **性能优化**:...
你可以定义监听器接口,Spring Data Redis会自动将接收到的消息转换为对应的方法调用。 8. **Redis配置** 在Spring Boot应用中,可以通过`application.properties`或`application.yml`配置Redis的相关参数,如`...
Spring提供了声明式事务管理,只需在Service层的方法上添加`@Transactional`注解,Spring就会自动管理事务的开始、提交或回滚。 8. **自定义查询** 虽然Spring Data JPA提供了很多默认的查询方法,但有时我们需要...
配置`Atomikos`或`Bitronix`这样的JTA事务管理器,可以实现对JMS和数据库操作的两阶段提交(2PC)协议,确保所有参与的资源要么全部完成事务,要么全部回滚。 在压缩包文件"shanhy-springjms"中,可能包含了以下...
在开始事务后,可以连续执行多个操作,最后通过Exec提交事务,如果中间有任何操作失败,所有操作都会回滚。 七、发布/订阅 Spring Data Redis提供了Publisher和Subscriber接口,用于实现Redis的发布/订阅功能。...