• ActiveMQ的学习(三)(ActiveMQ的消息事务和消息的确认机制)


    ActiveMQ的消息事务

     

    消息事务,是保证消息传递原子性的一个重要特性,和JDBC的事务特征类似。

    一个事务性发送,其中一组消息要么能够全部保证到达服务器,要么都不到达服务器。生产者,消费者与消息服务器都支持事务性。ActiveMQ得事务主要偏向在生产者得应用。

    ActiveMQ消息事务流程图:

    原生jms事务发送(生产者的事务发送)

     不加事务得情况:(程序没有错误,10条消息会到达mq中)

     

    不加事务得情况:(程序有错误,结果是发送成功3条,其余不成功---因为没有加事务) 

    加事务得情况:(程序无错误)

     1 @Autowired
     2 private JmsMessagingTemplate jmsMessagingTemplate;
     3 @Autowired
     4 private JmsTemplate jmsTemplate;
     5 @Value("${activemq.name}")
     6 private String name;
     7 
     8 public void sendMessageTx(){
     9     //获取连接工厂
    10     ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();  
    11     Session session = null;
    12     try{
    13         //创建连接
    14         Connection connection = connectionFactory.createConnection();
    15         //参数一:是否开启消息事务
    16         session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
    17         //创建生产者
    18         MessageProducer producer = session.createProducer(session.createQueue(name));
    19         
    20         for(int i=1;i<=10;i++){
    21             TextMessage textMessage = session.createTextMessage("消息--"+i);
    22             producer.send(textMessage);
    23         }
    24     
    25         //注意:一旦开启事务发送,那么就必须使用commit方法进行事务提交,否则消息无法到达MQ服务器
    26         session.commit();
    27     }catch(JMSException e){
    28         e.printStackTrace();
    29         //消息事务回滚
    30         try{
    31             session.rollback();
    32         }catch(JMSException e1){
    33             e1.printStackTrace();
    34         }
    35     
    36     }
    37 }

    加事务得情况:(程序有错误 结果一条都没有成功发送,原因就是开启了事务,事务的原子性导致的)

     1 @Autowired
     2 private JmsMessagingTemplate jmsMessagingTemplate;
     3 @Autowired
     4 private JmsTemplate jmsTemplate;
     5 @Value("${activemq.name}")
     6 private String name;
     7 
     8 public void sendMessageTx(){
     9     //获取连接工厂
    10     ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();  
    11     Session session = null;
    12     try{
    13         //创建连接
    14         Connection connection = connectionFactory.createConnection();
    15         //参数一:是否开启消息事务
    16         session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
    17         //创建生产者
    18         MessageProducer producer = session.createProducer(session.createQueue(name));
    19         
    20         for(int i=1;i<=10;i++){
    21         
    22             //模拟异常
    23             if(i==4){
    24                 int a = 10/0;
    25             }
    26             
    27             TextMessage textMessage = session.createTextMessage("消息--"+i);
    28             producer.send(textMessage);
    29         }
    30     
    31         //注意:一旦开启事务发送,那么就必须使用commit方法进行事务提交,否则消息无法到达MQ服务器
    32         session.commit();
    33     }catch(JMSException e){
    34         e.printStackTrace();
    35         //消息事务回滚
    36         try{
    37             session.rollback();
    38         }catch(JMSException e1){
    39             e1.printStackTrace();
    40         }
    41     
    42     }
    43 }

    JMSTransactionManager(生产者的事务发送)

    spring的JmsTransactionManager功能(这里不详细介绍了)

    消费者的事务接收

    这里要注意:如果重发了6次之后,还没有成功,那么会把该消息发送到一个死信队列中(至于什么叫死信队列在后面会提到)

     ActiveMQ的消息确认机制

    JMS消息只有在被确认之后,才认为已经被成功的消费了。消息的成功消费通常包含三个阶段:客户接收消息,客户处理消息和消息被确认。在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有三个可选值:

    注意:消息确认机制与事务机制是冲突的,只能选其中一种,所以演示消息确认前,先关闭事务。

    参考:

    黑马程序员视频:ActiveMQ部分的内容,若有侵权,请联系我,立即删除。

    持续更新!!!

  • 相关阅读:
    地图瓦片PNG8格式理解
    python gdal3.0安装记录
    gdal------坐标转换记录
    地图切片(加载)原理资料收集与整理
    cesium学习笔记001
    设计模式学习——观察者模式(c++)
    javascript的数组方法
    git的基本使用
    keep-alive
    防抖函数
  • 原文地址:https://www.cnblogs.com/flyinghome/p/12311964.html
Copyright © 2020-2023  润新知