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; } }