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