springboot 2.x整合rabbitmq之使用自定义Listener

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值