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);
        }
    }

}
相关推荐
AI小小怪16 小时前
在Linux服务器上安装CVAT (Docker 28.5.1)
运维·docker·容器·数据标注·cvat
小坏讲微服务18 小时前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
!chen18 小时前
k8s-Pod中的网络通信
网络·docker·kubernetes
suuijbd18 小时前
SpringCloud+Netty集群即时通讯项目
spring boot·分布式·spring cloud·java-rabbitmq·java-zookeeper
陈果然DeepVersion19 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十)
java·spring boot·ai·kafka·面试题·向量数据库·rag
余—笙20 小时前
Linux(docker)安装搭建CuteHttpFileServer/chfs文件共享服务器
linux·服务器·docker
摇滚侠20 小时前
Spring Boot3零基础教程,Reactive-Stream 四大核心组件,笔记106
java·spring boot·笔记
陈果然DeepVersion21 小时前
Java大厂面试真题:Spring Boot+微服务+AI智能客服三轮技术拷问实录(六)
java·spring boot·redis·微服务·面试题·rag·ai智能客服
芥子沫21 小时前
《玩转Docker》[应用篇13]:Docker安装部署Emby及使用技巧:家庭媒体服务器
docker·视频·emby
熙客1 天前
Kubernetes是如何保证有状态应用数据安全和快速恢复的
mysql·云原生·容器·kubernetes