目录
RabbitConfigDeal 配置类:创建队列及交换机并进行绑定
主启动类RabbitMq01Application:实现ApplicationRunner接口
基本介绍
它主要由以下属性可供选择 :
- Name:交换机名称;就是一个字符串
 - Type:交换机类型,direct, topic, fanout, headers四种
 - Durability:持久化,声明交换机是否持久化,代表交换机在服务器重启后是否还存在;
 - Auto delete:是否自动删除,曾经有队列绑定到该交换机,后来解绑了,那就会自动删除该交换机;
 - Internal:内部使用的,如果是yes,客户端无法直接发消息到此交换机,它只能用于交换机与交换机的绑定。
 - Arguments:只有一个取值alternate-exchange,表示备用交换机;
 
主要结论
结论1:没发消息之前不会创建交换机和对列
结论2:发消息后,如果交换机不存在,才开始创建交换机,如果队列不存在,则创建新的对列
结论3:创建交换机或者队列完成后再重新创建,如果修改交换机或队列参数则会报错
结论4:设置持久化为false ,重启rabbitmq-server,则交换机丢失,实验durable参数,看下控制台,然后重启rabbitmq-server
结论5:自动删除为 true ,从控制台上手动解绑,会发现自动删除
备用交换机
当消息经过交换器准备路由给队列的时候,发现没有对应的队列可以投递信息,在rabbitmq中会默认丢弃消息,如果我们想要监测哪些消息被投递到没有对应的队列,我们可以用备用交换机来实现,可以接收备用交换机的消息,然后记录日志或发送报警信息。
设置参考代码
Map<String, Object> arguments = new HashMap<>();
//指定当前正常的交换机的备用交换机是谁
arguments.put("alternate-exchange", EXCHANGE_ALTERNATE); 
//DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
return new DirectExchange(EXCHANGE, true, false, arguments);
//return ExchangeBuilder.directExchange(EXCHANGE).withArguments(args).build();
 
 
springboot代码实战(备用交换机)
实战架构

工程概述
工程采用springboot架构,主要用到的依赖为:
<!--        rabbit的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency> 
application.yml配置文件如下:
server:
  port: 8080
spring:
  rabbitmq:
    host: 123.249.70.148
    port: 5673
    username: admin
    password: 123456
    virtual-host: /
 
RabbitConfigDeal 配置类:创建队列及交换机并进行绑定
@Configuration
public class RabbitConfigDeal {
}
 
创建正常交换机
    @Bean
    public DirectExchange normalExchange() {
        Map<String, Object> arguments = new HashMap<>();
        //设置备用交换机
        arguments.put("alternate-exchange", "alternateExchange");
        return ExchangeBuilder.directExchange("normalExchange")
                .withArguments(arguments)
                .build();
    } 
创建备用交换机
    @Bean
    public FanoutExchange alternateExchange() {
        return ExchangeBuilder.fanoutExchange("alternateExchange").build();
    } 
创建备用交换的队列
    @Bean
    public Queue alternateQueue(){
        return QueueBuilder.durable("alternateQueue").build();
    } 
绑定备用交换机和队列
    @Bean
    public Binding bindingAlternateExchange(Queue alternateQueue, FanoutExchange alternateExchange){
        return BindingBuilder.bind(alternateQueue).to(alternateExchange);
    }
 
MessageService业务类:发送消息及接收消息
@Component
@Slf4j
public class MessageService {
    @Resource
    private RabbitTemplate rabbitTemplate;
} 
发送消息方法
   public void sendMsg(){
        MessageProperties messageProperties = new MessageProperties();
        Message message1 = new Message("hello word ".getBytes(), messageProperties);
        //发送消息
        rabbitTemplate.convertAndSend("alternateExchange", "info", message1);
        log.info("发送完毕:{}" , new Date());
    } 
 
 
接受消息
    @RabbitListener(queues = {"alternateQueue"})
    public void receiveMsg(Message message){
        byte[] body = message.getBody();
        String queue = message.getMessageProperties().getConsumerQueue();
        String msg=new String(body);
        log.info("{}接收到消息时间:{},消息为{}",queue,new Date(),msg);
    } 
 
 
 
主启动类RabbitMq01Application:实现ApplicationRunner接口
/**
 * @author 风轻云淡
 */
@SpringBootApplication
public class RabbitMq01Application implements ApplicationRunner {
    public static void main(String[] args) {
        SpringApplication.run(RabbitMq01Application.class, args);
    }
    @Resource
    private MessageService messageService;
    /**
     * 程序一启动就会调用该方法
     * @param args
     * @throws Exception
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        messageService.sendMsg();
    }
} 
 
启动主启动类后查看控制台:
2023-10-01 11:57:57.660  INFO 83984 --- [           main] 
c.e.rabbitmq01.service.MessageService    : 
发送完毕:Sun Oct 01 11:57:57 CST 2023
2023-10-01 11:57:57.718  INFO 83984 --- [ntContainer#0-1] 
c.e.rabbitmq01.service.MessageService    : 
alternateQueue接收到消息时间:Sun Oct 01 11:57:57 CST 2023,消息为hello word 









