Redis消息队列实现,基于Spring Boot和RedisTemplate实现自动配置

简介

某些场景下我们无法使用消息中间件提供消息队列功能,而需要使用Redis实现消息队列的功能时,可以引用该项目https://github.com/jo8tony/redis-mq#redis-mq或者https://gitee.com/jo8tony/redis-mq.git实现消息队列功能。
这是一个使用基于Redis列表数据类型实现的具有消息队列功能的项目,该项目建立在Spring Boot框架之上,通过Spring提供的RedisTemplate功能访问Redis服务,并利用Spring Boot自动配置的功能可以方便的注入其他项目中使用。

如何使用

1.克隆并打包

首先,你需要将项目克隆到本地,并且通过maven打包并发布到本地maven库中。

# 克隆项目
git clone https://github.com/jo8tony/redis-mq.git
# 在项目根目录下运行下面命令打包发布
mvn install
2.引入到项目

接下来需要这自己的Spring Boot项目中映入该工程的jar包。这里我们创建一个测试用的Spring Boot工程redis-mq-test。

<dependency>
    <groupId>top.aolien</groupId>
    <artifactId>redismq-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
3.添加配置

redis-mq依赖一旦引入到项目中便具有了它提供的消息队列功能,接下来需要添加一些redis相关的基本配置。redis-mq使用的是Spring提供的RedisTemplate的功能,所以参照该功能相关配置即可。

spring:
  redis:
    host: 127.0.0.1
    port: 6379

PS:如果关闭Redis消息队列的功能可以删除上面的jar包依赖,或者在配置文件中添加配置

redis:
  queue:
    listener:
      enable: false  #true表示开启redis消息队列监听功能
4.消息生产者示例

在测试工程redis-mq-test中创建普通java类Student,用于作为redis消息传递,当然也可以任意类,但是该类需要实现序列化接口Serializable

@Data
@Accessors(chain = true)
@ToString
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    private String sex;
    private Integer age;
}

然后创建一个TestController类,最作为web项目的接口用于发送给redis消息测试。
PS:redis消息发送的方法是RedisMQSender.send(参数1,参数2)方法,参数1是String类型的消息队列名称,参数2是实现序列化接口的你想传递的任意数据。

@RestController
public class TestController {

    @Autowired
    private RedisMQSender redisMQUtil;

    @RequestMapping("/send/msg")
    public String sendQueueMessage1(){
        Student student = new Student()
                .setId(88888888L)
                .setName("jo8tony")
                .setSex("男")
                .setAge(18);
        redisMQUtil.send("queue-1", student);
        return "SUCCESS";
    }

    @RequestMapping("/send/msg2")
    public String sendQueueMessage2(){
        Student student = new Student()
                .setId(99999999L)
                .setName("小红")
                .setSex("女")
                .setAge(20);
        redisMQUtil.send("queue-2", student);
        return "SUCCESS";
    }

}
5.消息消费者示例

创建一个RedisListenerContainer类用于定义redis队列消息监听处理方法。
PS: 实现redis队列监听只需在Spring容器所管理的Bean中的方法上添加注解@RedisListener(参数1),参数1是一个String类型的队列名称并且不能为空,表示该方法你需要处理的哪个队列的消息。注意被@RedisListener修饰的方法只能包含一个参数,这个参数的可以一个top.aolien.redis.mq.RedisMessage类型的参数,也可以是你需要传递的直接消息类型,例如这里的Student。

@Component
public class RedisListenerContainer {

    @RedisListener("queue-1")
    public void dealRedisMessage0(RedisMessage msg) {
        System.out.println("dealRedisMessage0收到queue-1队列消息: " + msg.toString());
    }

    @RedisListener("queue-1")
    public void dealRedisMessage1(Student student) {
        System.out.println("dealRedisMessage1收到queue-1队列消息: " + student.toString());
    }

    @RedisListener("queue-2")
    public void dealRedisMessage2(RedisMessage<Student> msg) {
        System.out.println("dealRedisMessage2收到queue-2队列消息: " + msg.toString());
    }
}

**注意:**你可以定义多个带有@RedisListener(参数1)注解的方法,并且参数1相同,注意如果这样该队列中的同一消息会被这些方法重复消费。分布式集群环境中不同程序监听同一队列,同一条消息只会被其中一个程序上的所有监听该队列的方法消费。

6.测试

完成以上步骤后启动测试项目redis-mq-test,可以看到如下日志,表示消息队列监听已启动成功
在这里插入图片描述
然后在浏览器中输入http://localhost:8080/send/msg地址,向队列queue-1中发送一条学生信息的消息,观察控制台结果:
在这里插入图片描述
这里应为定义了两个queue-1队列的处理方法dealRedisMessage0和方法dealRedisMessage1,所以消息被这两个方法重复消费了。

接着在浏览器中输入http://localhost:8080/send/msg2地址,向队列queue-2中发送一条学生信息的消息,观察控制台结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中使用Redis作为消息队列的监听器,可以通过Spring Data Redis提供的功能来实现。以下是一个基本的示例: 首先,确保你的Spring Boot项目中已经添加了Spring Data Redis的依赖。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,创建一个消息监听器类,用于接收和处理Redis消息。可以使用`@Component`注解将该类声明为Spring组件,并使用`@RedisListener`注解指定要监听的队列名称。 ```java import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String channel = new String(message.getChannel()); String body = new String(message.getBody()); // 处理接收到的消息 System.out.println("Received message: " + body + " from channel: " + channel); } } ``` 然后,在需要发送消息的地方,可以使用`RedisTemplate`来发送消息到指定的队列。可以使用`convertAndSend`方法来发送消息。 ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class MessageService { private final RedisTemplate<String, String> redisTemplate; public MessageService(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public void sendMessage(String message) { redisTemplate.convertAndSend("queue-name", message); } } ``` 最后,在启动类上添加`@EnableRedisRepositories`注解,以启用Spring Data Redis的功能。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @SpringBootApplication @EnableRedisRepositories public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 现在,当消息发送到指定的Redis队列时,监听器类中的`onMessage`方法将被自动调用,可以在该方法中进行消息的处理逻辑。 请注意,以上示例只是一个基本的演示,实际的应用中可能需要更多的配置和处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值