每天早上七点三十,准时推送干货
rabbitMQ 在互联网公司有着大规模应用,本篇将实战介绍 springboot 整合 rabbitMQ,同时也将在具体的业务场景中介绍利用 MQ 实现事务补偿操作。
一、介绍
在上篇文章中,我们详细的介绍了 rabbitMQ 的内部架构以及使用操作,本篇我们一起来实操一下SpringBoot
整合rabbitMQ
,为后续业务处理做铺垫。
废话不多说,直奔主题!
二、整合实战
2.1、创建一个 maven 工程,引入 amqp 包
<!--amqp 支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.2、在全局文件中配置 rabbitMQ 服务信息
spring.rabbitmq.addresses=197.168.24.206:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
其中,spring.rabbitmq.addresses
参数值为 rabbitmq 服务器地址
2.3、编写 rabbitmq 配置类
@Slf4j
@Configuration
public class RabbitConfig {
/**
* 初始化连接工厂
* @param addresses
* @param userName
* @param password
* @param vhost
* @return
*/
@Bean
ConnectionFactory connectionFactory(@Value("${spring.rabbitmq.addresses}") String addresses,
@Value("${spring.rabbitmq.username}") String userName,
@Value("${spring.rabbitmq.password}") String password,
@Value("${spring.rabbitmq.virtual-host}") String vhost) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(addresses);
connectionFactory.setUsername(userName);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(vhost);
return connectionFactory;
}
/**
* 重新实例化 RabbitAdmin 操作类
* @param connectionFactory
* @return
*/
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
return new RabbitAdmin(connectionFactory);
}
/**
* 重新实例化 RabbitTemplate 操作类
* @param connectionFactory
* @return
*/
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory);
//数据转换为json存入消息队列
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
/**
* 将 RabbitUtil 操作工具类加入IOC容器
* @return
*/
@Bean
public RabbitUtil rabbitUtil(){
return new RabbitUtil();
}
}
2.4、编写 RabbitUtil 工具类
public class RabbitUtil {
private static final Logger logger = LoggerFactory.getLogger(RabbitUtil.class);
@Autowired
private RabbitAdmin rabbitAdmin;
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 创建Exchange
* @param exchangeName
*/
public void addExchange(String exchangeType, String exchangeName){
Exchange exchange = createExchange(exchangeType, exchangeName);
rabbitAdmin.declareExchange(exchange);
}
/**
* 删除一个Exchange
* @param exchangeName
*/
public boolean deleteExchange(String exchangeName){
return rabbitAdmin.deleteExchange(exchangeName);
}
/**
* 创建一个指定的Queue
* @param queueName
* @return queueName
*/
public void addQueue(String queueName){
Queue queue = createQueue(queueName);
rabbitAdmin.declareQueue(queue);
}
/**
* 删除一个queue
* @return queueName
* @param queueName
*/
public boolean deleteQueue(String queueName){
return rabbitAdmin.deleteQueue(queueName);
}
/**
* 按照筛选条件,删除队列
* @param queueName
* @param unused 是否被使用
* @param empty 内容是否为空
*/
public void deleteQueue(String queueName, boolean unused, boolean empty){
rabbitAdmin.deleteQueue(queueName,unused,empty);
}
/**
* 清空某个队列中的消息,注意,清空的消息并没有被消费
* @return queueName
* @param queueName
*/
public void purgeQueue(String queueName){
rabbitAdmin.purgeQueue(q