ActiveMQ learning (c) (confirmation mechanism of ActiveMQ message transactions and messages)

ActiveMQ message transactions

 

Message transaction, atomicity is guaranteed message delivery is an important characteristic, and similar JDBC transaction characteristics.

A transactional transmission, wherein a set of messages can be either all guaranteed to reach the server, or the server is not reached. Producers, consumers and the message server supports transactional. ActiveMQ affairs was mainly in favor producers have applied.

ActiveMQ message transaction flowchart of:

Native jms transactions sent (transactions sent producers)

 Without the transaction was not the case :( program error 10 message will arrive in mq)

 

Without the transaction was the case :( program has an error, the result is sent successfully three, plus the rest of unsuccessful --- because there is no transaction) 

Plus transaction was the case :( program error)

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

 

持续更新!!!

Guess you like

Origin www.cnblogs.com/flyinghome/p/12311964.html