已有父工程
Provider的CallBack
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>RabbitMQ</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Providerr</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!--web起步包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
启动类
在启动类中配置队列和交换机,最后将二者绑定
package com.example;
import com.rabbitmq.client.AMQP;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class RabbitProviderApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitProviderApplication.class,args);
}
//创建队列
public Queue createQueue(){
// return new Queue("queue_demo01");
return new Queue("item_queue");
}
//创建交换机
@Bean
public DirectExchange createExchange(){
return new DirectExchange("exchange_direct_demo01");
}
//创建绑定
@Bean
public Binding createBinding(){
return BindingBuilder.bind(createQueue()).to(createExchange()).with("item_insert");
}
}
Provider的CallBack
application.xml
spring:
rabbitmq:
host: localhost
port: 5672
virtual-host: /
username: chocoMoss
password: 123456
publisher-confirm-type=correlated: correlated
publisher-return-type=correlated: correlated
server:
port: 8080
MyConfirmCallback
实现:RabbitTemplate.ConfirmCallback
重写方法
package com.example.confirm;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component
public class MyConfirmCallback implements RabbitTemplate.ConfirmCallback {
@Override
public void confirm(@Nullable CorrelationData correlationData, boolean ack, @Nullable String s) {
if (ack){
System.out.println("发送消息到交换机:"+s);
}else {
System.out.println("发送消息到交换机失败,原因是:"+s);
}
}
}
TestController
自动注入RabbitTemplate和其中的 ConfirmCallback
将ConfirmCallback设置进RabbitTemplate
package com.example.controller;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private RabbitTemplate.ConfirmCallback confirmCallback;
//发送消息
@RequestMapping("/send1")
public String send1(){
//设置回调函数
rabbitTemplate.setConfirmCallback(confirmCallback);
//发送消息
rabbitTemplate.convertAndSend("exchange_direct_demo01", "item.insert", "hello insert");
return "ok";
}
}
Provider的ReturnCallBack
MyReturnMessage
package com.example.returncallback;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
public class MyReturnMessage implements RabbitTemplate.ReturnCallback {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("退回的消息是:"+new String(message.getBody()));
System.out.println("退回的replyCode是:"+replyCode);
System.out.println("退回的replyText是:"+replyText);
System.out.println("退回的exchange是:"+exchange);
System.out.println("退回的routingKey是:"+routingKey);
}
}
Controller
相应的,在controller中添加 ReturnCallback
package com.example.controller;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private RabbitTemplate.ConfirmCallback confirmCallback;
@Autowired
private RabbitTemplate.ReturnCallback returnCallback;
//发送消息
@RequestMapping("/send1")
public String send1(){
//设置回调函数
rabbitTemplate.setConfirmCallback(confirmCallback);
//发送消息
rabbitTemplate.convertAndSend("exchange_direct_demo01", "item.insert", "hello insert");
return "ok";
}
//发送消息
@RequestMapping("/send2")
public String send2(){
//设置回调函数
rabbitTemplate.setReturnCallback(returnCallback);
//发送消息
rabbitTemplate.convertAndSend("exchange_direct_demo01", "item.insert", "hello insert");
return "ok";
}
}