代码编织梦想

消息事务
消息事务,是保证消息传递原子性的一个重要特征,和JDBC的事务特征类似。
一个事务性发送,其中一组消息要么能够全部保证到达服务器,要么都不到达服务器。
生产者、消费者与消息服务器直接都支持事务性;
ActionMQ的事务主要偏向在生产者的应用。

在这里插入图片描述

一、生产者事务:
方式一:

/**
* 加入事务
 */
@Test
public void txSender(){
    //获取连接工厂
    ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();
    Session session = null;
    try {
        //创建连接
        Connection connection = connectionFactory.createConnection();
        //参数一:是否启动消息事务
        session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
        //创建生产者
        MessageProducer messageProducer = session.createProducer(session.createQueue(name));

        for (int i = 0; i < 10; i++) {
            //模拟异常
            if (i==4){
                int a = 10/0;
            }
            TextMessage textMessage = session.createTextMessage("msg"+i);
            messageProducer.send(textMessage);
        }
        //注意:一旦开启事务发送,那么就必须使用commit方法进行事务提交,否则消息无法到达MQ服务器
        session.commit();
    } catch (JMSException e) {
        e.printStackTrace();
        //消息事务回滚
        try {
            session.rollback();
        } catch (JMSException e1) {
            e1.printStackTrace();
        }
    }
}

方式二

package com.test.producer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 消息发送业务类
 */
@Service
public class MessageService {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Value("${activemq.name}")
    private String name;

    @Transactional  //对消息发送加入事务管理(同时也对JDBC数据库事务生效)
    public void sendMsg(){
        for (int i = 0; i < 10; i++) {
            //模拟异常
            if (i==4){
                int a = 10/0;
            }
            jmsMessagingTemplate.convertAndSend(name,"msg --"+i);
        }
    }
}
@Autowired
private MessageService messageService;
 /**
  * 事务性发送 方案2: spring的JmsTransactionManager
  */
 @Test
 public void txSender2(){
     messageService.sendMsg();
 }

二、消费者事务

@Component  //放入IOC容器
public class MsgListener {
	/**
	 * 用于接收消息的方法
	 * destination:队列的名称或主题的名称
	 */
	@JmsListener(destination = "${activemq.name}")
	public void receiveMsg (Message message, Session session){
	    if(message instanceof TextMessage){
	        //接收文本消息
	        TextMessage textMessage = (TextMessage) message;
	        try {
	            System.out.println("接收消息:"+textMessage.getText());
	            int i =10/0;
	            //提交事务
	            session.commit();
	        } catch (JMSException e) {
	            e.printStackTrace();
	            try {
	                session.rollback();
	            } catch (JMSException e1) {
	                e1.printStackTrace();
	            }
	        }
	    }
	}
}

消息消费6次失败后,消息被存储在death queue中
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43732943/article/details/110847068

Spring整合ActiveMQ-爱代码爱编程

1、依赖 1.1 Spring依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.10.RELEAS

JMS消息-爱代码爱编程

JMS消息头 在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用以上 setJMSXXX()方法分配的值就被忽略了,只有以下几个值是可以由开发者设置的: JMSCorrelationID,JMSReplyTo,JMSType JMS消息体 · TextMessage–一个字符串对象 · MapMessage–一套名称-值对 · ObjectMe

java日常学习小问题处理(20201206-01)-爱代码爱编程

Activemq访问不了管理页面解决方案 原因:8161端口都开启的情况下还是访问不了管理页面 解决方案:修改apache-activemq-5.16.0/conf/jetty.xml配置文件 (1)将name=host里的地址(127.0.0.1)改为0.0.0.0 <bean id="jettyPort" class="o

视频 | 为何我对小鹏NGP“半信半疑”-爱代码爱编程

小鹏NGP即将上线,想聊一聊我对它的惊叹与担忧。   NGP直译过来叫「高速自动导航驾驶」,和我们经常听到的「领航辅助」,其实是一回事。最早被小鹏汽车NGP种草是在今年5月,它功能更强大,简单说就是在车辆车机上设定导航后,车辆会自动按照导航线路巡航、自动换道、自动进出匝道。   毫不夸张的讲,NGP背后的技术,是当下量产汽车搭载的自动

深度报告(69页附下载)| 蜂窝车联网(C-V2X)技术与产业发展态势前沿报告2020-中国通信学会-爱代码爱编程

建议PC端阅读,下载完整PDF全文, 请关注本公众号后台回复“ 201207 ” 下载

ActiveMQ 代码案例-爱代码爱编程

一、原生API pom依赖 生产者 package cn.enjoyedu.usemq; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /** *类说明: