RabbitMq - SpringBooot发布确认

1.首先建立一个springboot工程

编写xml文件

</dependency>

        <!--RabbitMQ 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--RabbitMQ 测试依赖-->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

2.编写配置文件

spring.rabbitmq.host=192.168.0.111
spring.rabbitmq.username=admin
spring.rabbitmq.password=123
spring.rabbitmq.port=5672
spring.rabbitmq.publisher-confirm-type=correlated

3.编写配置类

发布确认高级:

@Configuration
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnsCallback{


    //将这个实现类注入到RabbitTemplate中
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
    }
    /*
          交换机确认回调方法:
          1.发消息  交换机收到 回调
                参数1:保存回调消息的id以及相关消息
                参数2:交换机收到消息  ack = true
                参数3: cause  null
          2.发消息   交换机收到失败  回调
                参数1: 保存回调消息的id以及相关消息
                参数2: 交换机收到消息  ack = false
                参数3: cause  失败原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {

        String id = correlationData != null ? correlationData.getId() : "";
        if (b){
                log.info("交换机收到消息 : id为 {}",id);
            }else {

                log.info("交换机没有收到消息 ,id为 {} , 原因是: {}",id,s);
        }

    }

    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        String msg = new String(returnedMessage.getMessage().getBody());
        log.info("消息 {}  , 被交换机 {}回退了 , 回退的原因是: {} , 路由是key:{}" ,
                 msg , returnedMessage.getExchange() , returnedMessage.getReplyText(),
                returnedMessage.getRoutingKey()
                );
    }
}

4.编写controller

@RestController
@RequestMapping("/confirm")
public class ProduceController {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    public static final String CONFIRM_QUEUE_NAME = "confirm_queue";
    public static final String CONFIRM_EXCHANGE_NAME = "confirm_exchange";
    public static final String CONFIRM_ROUTING_KEY = "key1";

    @GetMapping("/sendMsg/{message}")
    public void sendMessage(@PathVariable String message){
        rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME,CONFIRM_ROUTING_KEY, message);
    }
}

5.编写消费者

@Component
@Slf4j
public class Consumer {

    @RabbitListener(queues  = ConfirmConfig.CONFIRM_QUEUE_NAME)
    public void receiveConfirmMessage(Message message){

        String msg = new String(message.getBody());
        log.info("接收到的队列消息为 :  {}",msg);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值