1、在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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.scau</groupId>
<artifactId>rabbit-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbit-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</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-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、在配置文件:application.yml中配置rabbitmq相关信息
server:
port: 8080
spring:
rabbitmq:
#配置rabbitmq连接信息
host: 192.168.24.130
port: 5672
username: admin
password: 445221abcd
virtual-host: /
#配置消息队列名
data:
index: data.index
income: data.income
#开启所有端点监控
management:
endpoints:
web:
exposure:
include: "*"
3、自定义一个消息发送器,并添加到容器中
package com.scau.provider.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 自定义消息发送器
*
* @author chen
* @date 2019/03/30
*/
@Component
public class MqSender {
private static final Logger logger = LoggerFactory.getLogger(MqSender.class);
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
public MqSender(ConnectionFactory connectionFactory) {
// rabbitmq默认的连接工厂
CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory) connectionFactory;
// 启用rabbitmq的发送确认机制
cachingConnectionFactory.setPublisherConfirms(true);
cachingConnectionFactory.resetConnection();
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setMandatory(true);
// 设置消息转换器(消息转换成json)
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
// 设置消息发送后回调(收到ack,即消息发送结果,调用函数)
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
if (!ack) {
logger.info("=======消息发送失败=======");
}
});
}
public boolean send(Object message, String routingKey) {
logger.info("========开始发送消息========");
rabbitTemplate.convertAndSend(routingKey, message);
logger.info("========完成发送消息========");
return true;
}
}
4、自定义一个消息监听器,并添加到容器中
package com.scau.provider.listener;
import com.scau.provider.service.ProviderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/**
* 消息监听器
*
* @author chen
* @date 2019/03/30
*/
@Component
public class IncomeListener extends SimpleMessageListenerContainer {
private static final Logger logger = LoggerFactory.getLogger(IncomeListener.class);
@Autowired
private ProviderService providerService;
/**注入rabbitmq连接工厂与要监听的消息队列(消息队列可有多个)*/
@Autowired
public IncomeListener(ConnectionFactory connectionFactory, @Qualifier("incomeQueue") Queue queue) {
super(connectionFactory);
// 设置暴露channel
this.setExposeListenerChannel(true);
// 设置监听的队列
this.setQueues(queue);
// 设置并发量为1
this.setMaxConcurrentConsumers(1);
this.setConcurrentConsumers(1);
// 设置手动接收消息
this.setAcknowledgeMode(AcknowledgeMode.MANUAL);
// 设置监听消息
this.setMessageListener((ChannelAwareMessageListener) (message, channel) -> {
// 确认选择
channel.confirmSelect();
byte[] body = message.getBody();
logger.info("======接收到消息======");
logger.info("======消息内容:" + new String(body) + "======");
//接收消息后返回ack
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
// 调用service往其他队列发送消息
providerService.sendMessage();
});
}
}
5、编写Service类,调用MqSender向其他消息队列发送消息
package com.scau.provider.service.impl;
import com.scau.provider.service.ProviderService;
import com.scau.provider.util.MqSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* 消息生产者业务类
*
* @author chen
* @date 2019/03/30
*/
@Service
public class ProviderServiceImpl implements ProviderService {
@Autowired
private MqSender sender;
// 目标消息队列
@Value("spring.rabbitmq.data.index")
private String indexQueue;
private static final Logger logger = LoggerFactory.getLogger(ProviderServiceImpl.class);
@Override
public boolean sendMessage() {
String message = "Hello World!";
sender.send(message, indexQueue);
logger.info("========发送消息给: " + indexQueue + "=======");
return true;
}
}

本文介绍了如何在SpringBoot 2.x项目中整合RabbitMQ,通过自定义监听器来接收和处理消息。首先在pom.xml添加RabbitMQ依赖,接着配置application.yml文件,设定相关连接信息。然后创建自定义的消息发送器和监听器,并将它们注册到Spring容器中。最后,在Service层中调用MqSender发送消息至队列。
3068

被折叠的 条评论
为什么被折叠?



