spring boot 添加redis订阅消息队列监听器线程问题

使用spring boot集成redis,实现消息队列的订阅发布。
在我的订阅端,我自定义了一个实现了MessageListener接口的类,然后使用如下代码进行配置

@Configuration
public class RedisConfig {

    @Value("${spring.redis.listener}")
    private String channelName;

    @Autowired
    private RedisListener redisListener;

    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory factory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        // 订阅通道
        container.addMessageListener(redisListener, new PatternTopic(channelName));
        return container;
    }


    /**
     * 配置RedisTemplate,解决乱码问题
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        // string序列化方式
        RedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        // 设置默认序列化方式
        template.setDefaultSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }

    @Bean
    public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
    
}

但是进行测试的时候发现,这个方法添加的redis订阅消息监听器,每次监听到消息都要开启一个新的线程。
请问有没有办法让这个监听线程单线程执行,即我当前的spring boot项目只有spring boot自带的线程和我定义的监听消息线程。

倒是没注意过这个问题,你要不然尝试在执行方法上添加 @Async,注解,然后通过该注解指定执行的线程池 beanName 试试看?

好像也只能这么尝试一下了

1 个赞

我今天也遇到了这个问题,发现 RedisMessageListenerContainer 有个api可以设置线程池。
问题解决。

redisMessageListenerContainer.setTaskExecutor(this.threadPoolTaskExecutor);

解决了,太感谢了

1 个赞