Docker 部署RabbitMQ

文章目录

镜像

bash 复制代码
docker pull rabbitmq:management
docker pull rabbitmq:4.0.7-management

docker-compose.yml

yml 复制代码
services:
  rabbitmq:
    image: rabbitmq:3.9.5-management
    container_name: rabbitmq
    restart: always
    network_mode: "host"
    volumes:
      - /etc/localtime:/etc/localtime
      - ./rabbitmq/data:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: Test123
      RABBITMQ_DEFAULT_VHOST: /test
  • 部署 RabbitMQ
bash 复制代码
docker-compose up -d rabbitmq

访问控制台

Spring Boot

  • pom.xml
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  • application.yml
yml 复制代码
spring:
  rabbitmq:
    host: 192.168.0.140
    port: 5672
    username: admin
    password: Test123
    virtual-host: /test
    listener:
      simple:
        # ACK模式(none,auto,manual,默认为auto)
        acknowledge-mode: auto
        # 开启重试
        retry:
          # 是否开启重试机制
          enabled: true
          # 最大重试次数
          max-attempts: 5
          # 重试间隔(ms)
          initial-interval: 5000

批量声明队列

  • 常量类 MQConstants
java 复制代码
public class MQConstants {

    public static final String TEST_QUEUE_1 = "test-queue-1";
    public static final String TEST_QUEUE_2 = "test-queue-2";
    
}
  • RabbitMQConfig
java 复制代码
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class RabbitMQConfig {

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }

    @Bean
    public List<Queue> createQueues(RabbitAdmin rabbitAdmin) {
        List<Queue> queueList = new ArrayList<>();
        List<String> queueNameList = getConstantsValueList(MQConstants.class);
        for (String queueName : queueNameList) {
            queueList.add(new Queue(queueName, true));
        }
        // 让 RabbitAdmin 主动声明队列
        queueList.forEach(rabbitAdmin::declareQueue);
        return queueList;
    }

    private List<String> getConstantsValueList(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        List<String> valueList = new ArrayList<>(fields.length);
        for (Field field : fields) {
            int modifiers = field.getModifiers();
            if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
                try {
                    valueList.add(field.get(null).toString());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return valueList;
    }

}
  • 生产者
java 复制代码
public Test {
	
	@Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test() {
        rabbitTemplate.convertAndSend(MQConstants.TEST_QUEUE_1, "test");
    }
}
  • 消费者
java 复制代码
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

@Component
public class TestConsumer implements ChannelAwareMessageListener {

    @RabbitListener(queues = MQConstants.TEST_QUEUE_1, concurrency = "10")
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        String body = new String(message.getBody());
        System.out.println(" [x] Received: " + body);
        try {
            // 模拟业务逻辑
            if ("error".equals(body)) {
                throw new Exception("处理失败");
            }

            // 处理成功,手动 ACK
            // channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            System.out.println(" [✔] Done");
        } catch (Exception e) {
        	System.out.println(" [✖] Error: " + e.getMessage());
        	// 抛异常自动重试
        	throw e;
        	
            // 失败后重新入队
            // channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }

}
相关推荐
Java爱好狂.7 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
码间留白10 小时前
手把手把 GitHub 推上阿里云 ECS:Actions CI/CD 全链路避坑实录(折腾好几天,到 2 分钟见绿)
运维·阿里云·ci/cd·docker·devops·github actions
Vex2une10 小时前
Docker Desktop WSL2后端:2026年性能调优与避坑实战指南
windows·docker·desktop·gpu容器·容器开发·virtiofs·buildkit
程序员老赵11 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
TTATTC11 小时前
为什么单会话聊天做不好复杂工程?Claude Code 创作者的并发 Worktree 与记忆闭环实践
docker·开源
TTATTC11 小时前
状态机驱动长事务,还是 DAG 编排高并发?高可靠业务流程引擎的双核架构设计
docker·开源
殷忆枫12 小时前
告别依赖地狱!在 Ubuntu 上用 Docker 极速部署 Home Assistant 与 MQTT,并接入 Siri 与嵌入式 C 终端
linux·ubuntu·docker
顽疲12 小时前
java springboot vue 养老系统源码详解:请假 care_leave 销假与床位停费日扣实践
java·vue.js·spring boot
Java_AI工程师13 小时前
Spring4 / SpringBoot1.x 老项目想接入 AI?不用升级框架!3 套无痛落地方案
java·人工智能·spring boot
VimorphTech13 小时前
Java 文件缓存实战:如何避免读到未下载完成的视频?
java·spring boot