Spring Boot-了解下Redis的发布订阅操作

先定义两个消息监听器,分别用来监听不同主题的消息

用来监听主题topic消息的监听器TopicMessageListener,如下:

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

@Component
public class TopicMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String body = new String(message.getBody());
        String topic = new String(bytes);
        System.out.println("当前线程=" + Thread.currentThread().getName());
        System.out.println("消息体=" + body);
        System.out.println("主题=" + topic);
    }
}

用来监听主题topic1消息的监听器Topic1MessageListener,如下:

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

@Component
public class Topic1MessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String body = new String(message.getBody());
        String topic = new String(bytes);
        System.out.println("当前线程=" + Thread.currentThread().getName());
        System.out.println("消息体1=" + body);
        System.out.println("主题1=" + topic);
    }
}

初始化redis的监听容器,添加上监听器与其要监听的主题


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import javax.annotation.PostConstruct;

@Configuration
public class RedisConfig {

    @Autowired
    private RedisTemplate redisTemplate;


    @Autowired
    private RedisConnectionFactory redisConnectionFactory;//Redis连接工厂


    @Autowired
    private TopicMessageListener topicMessageListener;//redis消息监听器--topic

    @Autowired
    private Topic1MessageListener topic1MessageListener;//redis消息监听器--topic1


    private ThreadPoolTaskScheduler threadPoolTaskScheduler = null;//线程池

    @PostConstruct
    public void init() {
        initRedisTemplate();
    }

    /**
     * 设置redis的key-value序列化器为字符串序列化器
     */
    private void initRedisTemplate() {
        RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
    }

    /**
     * 初始化一个线程池,等待着处理消息
     *
     * @return
     */
    @Bean
    public ThreadPoolTaskScheduler initThreadPoolTaskScheduler() {
        if (threadPoolTaskScheduler != null) {
            return threadPoolTaskScheduler;
        }
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(10);
        //设置线程名称前缀
        threadPoolTaskScheduler.setThreadNamePrefix("发布订阅线程-");
        return threadPoolTaskScheduler;
    }

    /**
     * 初始化redis的监听容器
     *
     * @return
     */
    @Bean
    public RedisMessageListenerContainer initRedisMessageContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        redisMessageListenerContainer.setTaskExecutor(initThreadPoolTaskScheduler());
        //定义二个主题,分别是topic和topic1
        Topic topic = new ChannelTopic("topic");
        Topic topic1 = new ChannelTopic("topic1");
        //使用监听器监听redis消息
        redisMessageListenerContainer.addMessageListener(topicMessageListener, topic);
        redisMessageListenerContainer.addMessageListener(topic1MessageListener, topic1);
        return redisMessageListenerContainer;
    }
}

通过redis客户端发送消息,如下:
Spring Boot-了解下Redis的发布订阅操作_第1张图片
分别向topic与topic1发送了一个消息,输出结果如下:
Spring Boot-了解下Redis的发布订阅操作_第2张图片
从输出结果可以发现,处理消息的线程就是我们定义的线程池中的线程,然后消息监听器会针对收到的消息做自己相应的业务处理。

你可能感兴趣的:(Spring,Boot,了解下Redis的发布订阅操作)