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

}
相关推荐
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 14 章 打包与部署 Spring Boot 应用打包 阅读笔记 41
spring boot·笔记·后端
大梦想家a2 小时前
新能源汽车共享充电桩收费管理系统的设计与实现(SpringBoot+MyBatis-Plus+Vue,前后台分离完整源码)
spring boot·汽车·mybatis
LRL_2 小时前
深入浅出 Kubernetes 控制器:Deployment 与 StatefulSet 核心区别全景图
云原生·容器·kubernetes
起名真的太难了3 小时前
Docker 项目部署
docker·容器·eureka
狼与自由3 小时前
docker 安装milvus
docker·milvus
专注仿真3 小时前
RabbitMQ消息队列实战项目
数据结构·rabbitmq
摇滚侠3 小时前
《SpringBoot 3:入门与应用实战》第 14 章 打包与部署 制作 Docker 镜像 阅读笔记 43
spring boot·笔记·docker
MrSYJ3 小时前
Network Namespace 到底是个啥,别人再问你告诉他
docker·云原生·kubernetes
程序员老赵3 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·后端·docker
xiaoqiMikko5 小时前
七条 advisory 各给了一个修复版,而一次修完的那个数字一条都没写
java·spring boot