Spring Data Redis实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。

定义:
生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。
发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。


下面就以Spring Data Redis实现简单的消息“发布/订阅”服务。

spring-redis使用RedisMessageListenerContainer进行消息监听,客户程序需要自己实现MessageListener,并以指定的topic注册到RedisMessageListenerContainer,这样,在指定的topic上如果有消息,RedisMessageListenerContainer便会通知该MessageListener。

下面是在spring配置文件中配置spring-redis:


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">

    
    
   
    package="com.ljq.durian" />

     
    class="redis.clients.jedis.JedisPoolConfig">
        
        
        
        
        
    
    
      
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  
          
          
          
          
          
      
    
    class="org.springframework.data.redis.core.RedisTemplate">  
          
          
            class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
          
      
    
    class="com.ljq.durian.common.listener.RedisMessageListener">  
          
      

    class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
        
        
            
                
                    
                        
                        class="org.springframework.data.redis.listener.ChannelTopic">
                            
                        
                        
                        class="org.springframework.data.redis.listener.PatternTopic">
                            
                        
                        
                        class="org.springframework.data.redis.listener.PatternTopic">
                            
                        
                    
                
            
        
    
     

上面例子中,最后三个bean的配置是实现发布/订阅服务的关键,RedisMessageListener是自己写的实现了org.springframework.data.redis.connection.MessageListener的业务类,并以“topic.channel” 这个topic注册到RedisMessageListenerContainer。RedisMessageListenerContainer在消息到达后负责通知MessageListener。
下面是RedisMessageListener的代码:

package com.ljq.durian.common.listener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;


public class RedisMessageListener implements MessageListener {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        RedisSerializer serializer = redisTemplate.getValueSerializer();
        Object channel = serializer.deserialize(message.getChannel());
        Object body = serializer.deserialize(message.getBody());  
        System.out.println("主题: " + channel);
        System.out.println("消息内容: " + String.valueOf(body));
    }

    public RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}

 

这样,应用启动时,消息的订阅方(subscriber)就注册好了。这时候只要使用一个简单的程序,模拟publisher,向指定topic发布消息,RedisMessageListener就可以接收到消息,spring-redis的写法是这样:

redisTemplate.convertAndSend("topic.channel", "hello world!");

你可能感兴趣的:(Spring Data Redis实现消息队列——发布/订阅模式)