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

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

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;
    }
}
在Spring Boot中整合RabbitMQ时,`CachingConnectionFactory` 是一个关键的组件,它用于创建RabbitMQ 服务器的连接,并提供连接缓存以提高性能。通过合理配置 `CachingConnectionFactory`,可以优化消息队列的发送和接收效率。 首先,需要引入 RabbitMQ 的依赖项。在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 接着,在 `application.yml` 或 `application.properties` 中配置 RabbitMQ 的连接信息: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / ``` 然后,可以通过自定义 `CachingConnectionFactory` 来进一步优化连接池的配置。例如,设置缓存的通道数量、连接超时时间等: ```java @Configuration public class RabbitMQConfig { @Value("${spring.rabbitmq.host}") private String host; @Value("${spring.rabbitmq.port}") private int port; @Value("${spring.rabbitmq.username}") private String username; @Value("${spring.rabbitmq.password}") private String password; @Bean public CachingConnectionFactory cachingConnectionFactory() { CachingConnectionFactory factory = new CachingConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(username); factory.setPassword(password); factory.setVirtualHost("/"); factory.setChannelCacheSize(10); // 设置缓存的通道数量 factory.setConnectionTimeout(5000); // 设置连接超时时间 return factory; } @Bean public RabbitTemplate rabbitTemplate(CachingConnectionFactory cachingConnectionFactory) { return new RabbitTemplate(cachingConnectionFactory); } @Bean public SimpleMessageListenerContainer messageListenerContainer(CachingConnectionFactory cachingConnectionFactory) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cachingConnectionFactory); container.setQueueNames("example.queue"); // 设置监听的队列名称 container.setMessageListener(new MessageListenerAdapter(new MyMessageListener())); return container; } } ``` 在上述配置中,`CachingConnectionFactory` 被用来创建 `RabbitTemplate` 和 `SimpleMessageListenerContainer`。`RabbitTemplate` 用于发送消息,而 `SimpleMessageListenerContainer` 用于监听并处理从队列中接收到的消息。 此外,还可以通过实现 `MessageListener` 接口来定义消息的处理逻辑: ```java public class MyMessageListener implements MessageListener { @Override public void onMessage(Message message, Channel channel) throws Exception { // 处理接收到的消息 String msg = new String(message.getBody(), "UTF-8"); System.out.println("Received message: " + msg); // 手动确认消息已处理 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } } ``` 通过上述配置和代码,Spring Boot 应用程序可以有效地与 RabbitMQ 集成,实现高效的消息队列功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值