不懂RabbitMQ基础的小伙伴们,可以去这个地方先看一下https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html
GitHub:https://github.com/AAAJYH/SpringBoot.git
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.配置文件application.yml(用application.properties的小伙伴这样写:spring.rabbitmq.host)
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
3.配置交换机Exchange,可以配置多个
package com.rabbitmq;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExchangeConfig {
/** 消息交换机的名字 */
public static final String DIRECT_EXCHANGE_NAME = "exchangeTest";
/**
* 1.定义direct exchange,绑定exchangeTest
* 2.durable="true" rabbit重启的时候不需要创建新的交换机,默认true
* 3.autoDelete 交换机在没有使用的时候自动被删除
* @return
*/
@Bean
public DirectExchange directExchange(){
DirectExchange directExchange = new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
return directExchange;
}
}
4.配置队列Queue,可以配置多个
package com.rabbitmq;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueueConfig {
@Bean
public Queue firstQueue(){
/**
* queue-first 队列名称
* durable="true" 消息持久化,宕机后未消费的消息,不会删除,默认true
* auto-delete 表示消息队列没有在使用时将被自动删除,默认是false
* exclusive 表示该消息队列是否只在当前connection生效,默认false
*/
return new Queue("queue-first", true, false, false);
}
}
5.配置RabbitMQ
package com.rabbitmq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
@Autowired
private QueueConfig queueConfig;
@Autowired
private ExchangeConfig exchangeConfig;
@Autowired
private ConnectionFactory connectionFactory;
public static final String ROUTINGKEY_ONE = "routingKeyOne";
/**
* 将交换机和队列进行绑定,并设置routingKey
* @return
*/
@Bean
public Binding bindingOne(){
return BindingBuilder.bind(queueConfig.firstQueue()).
to(exchangeConfig.directExchange()).with(ROUTINGKEY_ONE);
}
/**
* 注入rabbitTemplate用于数据的接收和发送
*/
@Bean
public RabbitTemplate rabbitTemplate(){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
}
6.消息发送类(生产者)
package com.rabbitmq;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class SendMessage {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 将消息路由到交换机绑定的队列
* CorrelationData 消息的关联id
* @param message 消息内容
*/
public void send(Object message){
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("exchangeTest", "routingKeyOne" , message, correlationData);
}
}
7.消息监听类(消费者)
package com.rabbitmq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MessageConsumer {
Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
/**
* 队列监听器:监听队列收到新消息进行处理,监听相同的队列使用轮训模式
* @param message
*/
@RabbitListener(queues = {"queue-first"})
public void handleMessageOne(String message){
logger.info("1处理消息:"+ message);
}
@RabbitListener(queues = {"queue-first"})
public void handleMessageTwo(String message){
logger.info("2处理消息:"+ message);
}
}
8.控制类调用send方法生产消息
package com.rabbitmq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SendController {
@Autowired
private SendMessage firstSender;
@GetMapping("/send")
public String send(String message){
firstSender.send(message);
return "ok";
}
}
好了,终于到最后了,启动项目,访问/send请求路径如:localhost:8080/send?message=abcdefg
小伙伴们如果有解决消息阻塞和消息补偿机制请在下方评论
结束语:如果有写的不好或者不太懂得地方可以在下方评论