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部分的内容,若有侵权,请联系我,立即删除。
持续更新!!!
















