ActiveMQの学習(C)(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部分的内容,若有侵权,请联系我,立即删除。

 

持续更新!!!

おすすめ

転載: www.cnblogs.com/flyinghome/p/12311964.html