zoukankan      html  css  js  c++  java
  • 阿里高级架构师教你使用Spring JMS处理消息事务源码案例

    消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失。该源码展示如何使用本地事务解决这个问题。这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听执行失败)。之所以出现这种情况是因为JMS交易是独立于像数据库等事务性资源。如果您的处理不是幂等或者如果您的应用程序不支持重复消息检测,那么你将不得不使用分布式事务。分布式事务是超出了本源码案例的范围。

    消费者的代码如下:

    @Component("notificationProcessor")

    public class NotificationProcessor implements MessageListener {

    private static Logger logger = LoggerFactory.getLogger(NotificationProcessor.class);

    @Autowired

    private JdbcTemplate jdbcTemplate;

    @Override

    public void onMessage(Message message) {

    try {

    Notification notification = (Notification) ((ObjectMessage) message).getObject();

    logger.info("Received notification | Id: "+notification.getId()+" | Redelivery: "+getDeliveryNumber(message));

    checkPreprocessException(notification);

    saveToBD(notification);

    checkPostprocessException(message, notification);

    } catch (JMSException e) {

    throw JmsUtils.convertJmsAccessException(e);

    }

    }

    ...

    }

    当带有id=1的notification到达时, checkPreprocessException 将抛出一个运行错误,在存储消息到数据库之前引法一个错误。

    当带有id=2的notification到达时,checkPostprocessException方法将抛出一个exception,这样在存储数据库之后引发一个错误。

    当消息已经被发送以后,getDeliveryNumber 方法返回次数,这里使用事务机制

    saveToDB是存储一个notification 到数据库.

    写在最后:欢迎留言讨论,加关注,持续更新!!!

  • 相关阅读:
    通过docker把本地AspNetCore WebAPI镜像打包到阿里云镜像仓库并在centos部署
    记一次Java AES 加解密 对应C# AES加解密 的一波三折
    .Net Core MVC实现自己的AllowAnonymous
    Net Core 中间件实现修改Action的接收参数及返回值
    手把手教你实现自己的abp代码生成器
    C# 实现Jwtbearer Authentication
    vs2017调试浏览器闪退
    ABP 邮箱设置
    FastJson反序列化获取不到值
    内网环境下搭建maven私服小技巧
  • 原文地址:https://www.cnblogs.com/Ti1077/p/9598570.html
Copyright © 2011-2022 走看看