Spring boot操作RabbitMQ (直连型交换机)
1.搭建2个Spring boo工程
<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>
2. application.ymal文件配置连接属性
/*配置好访问路径,项目启动端口号*/
//配置rabbitMQ
rabbitmq:
host: IP //安装rabbitMQ的服务器IP地址
port: 5672
username: ******
password: ******
publisher-confirm-type: correlated
publisher-returns: true
3.编写RabbitMQConfig类
@Configuration
@Slf4j
public class RabbitConfig {
@Bean
public Queue testRabbitMQ() {
return new Queue("testRabbitMQ", true, false, false);
}
@Bean
public Queue testRabbitMQ02() {
return new QUeue("testRabbitMQ02");
}
@Bean
DirectExchange exchange() {
return new DirectExchange("testDirectExchange");
}
@Bean
Binding bindingExchangeMessage() {
return BindingBuilder.bind(testRabbitMQ()).to(exchange()).with("testDirectKey");
}
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("ConfirmCallback: "+"相关数据:"+correlationData);
System.out.println("ConfirmCallback: "+"确认情况:"+ack);
System.out.println("ConfirmCallback: "+"原因:"+cause);
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("ReturnCallback: "+"消息:"+message);
System.out.println("ReturnCallback: "+"回应码:"+replyCode);
System.out.println("ReturnCallback: "+"回应信息:"+replyText);
System.out.println("ReturnCallback: "+"交换机:"+exchange);
System.out.println("ReturnCallback: "+"路由键:"+routingKey);
}
});
return rabbitTemplate;
}
}
4.编写接口进行测试
@RestController
@Slf4j
@RequestMapping("/rabbit")
public class RabbitMqController {
@RequestMapping("/sendDirectMessage")
public void sendDirectMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,Object> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime", createTime);
log.info("rabbitmq: 开始发送消息!!!");
rabbitTemplate.convertAndSend("交换机的名称", "消息队列名称", map);
}
}
5.消费消息
@Component
@RabbitListener(queues = "testRabbitMQ")
public class DirectReceiver {
@RabbitHandler
public void process(Map testMessage) {
System.out.println("DirectReceiver消费者收到消息 : " + testMessage.toString());
}
}