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