专栏首页用户7614879的专栏Springboot2 整合redis发布订阅 解决订阅多个频道重复代码过多 创建很多bean问题

Springboot2 整合redis发布订阅 解决订阅多个频道重复代码过多 创建很多bean问题

之前的写法 每个频道都要写个@bean 重复代码太多

import cn.tim.util.Constants;
import com.alibaba.druid.filter.config.ConfigTools;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.MapPropertySource;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Configuration
@ConditionalOnClass(RedisTemplate.class)
public class RedisConfig {

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

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

    @Value("${public-key}")
    private String publicKey;

    private static final String SEPARATOR = ",";
    private static final String HOST_PORT_SEPARATOR = ":";

    /**
     * redis 发布订阅配置
     */
    @Bean
    RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory lettuceConnectionFactory,
                                                                Map<String, MessageListenerAdapter> messageListenerAdapterMap) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(lettuceConnectionFactory);
        log.info("subscribe begin...");
        messageListenerAdapterMap.forEach((k, v) -> {
            log.info("redis subscribe for " + k);
            container.addMessageListener(v, new PatternTopic(k));
        });
        log.info("subscribe end");
        return container;
    }

    /**
     * 初始化订阅频道及处理方法适配器映射 注意方法名不存在会导致系统无法启动
     */
    @Bean
    Map<String, MessageListenerAdapter> messageListenerAdapterMap(RedisMessageReceiver redisMessageReceiver) {
        Map<String, MessageListenerAdapter> map = new HashMap<>(16);
        map.put(Constants.IOC_DISABLE_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "iocDisable"));
        map.put(Constants.API_SUB_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "apiSub"));
        map.put(Constants.IOC_ADD_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "iocAdd"));
        map.put(Constants.SOURCE_SUB_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "sourceSub"));
        map.put(Constants.PLUGIN_SUB_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "pluginSub"));
        map.put(Constants.IOC_REFRESH_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "iocRefresh"));
        map.put(Constants.TTPS_SUB_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "ttpsSub"));
        map.put(Constants.SOURCE_API_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "sourceApi"));
        map.put(Constants.PROXYCONF_SUB_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "proxyConfSub"));
        map.put(Constants.SYSLOG_CONFIDENCE_CHANNEL, new MessageListenerAdapter(redisMessageReceiver, "syslogConfidence"));
        map.put("test_pubsub", new MessageListenerAdapter(redisMessageReceiver, "test"));
        //重要 调用一次afterPropertiesSet 设置method.invoke
        //否则invoke为空 会nullPoint
        map.forEach((k, v) -> v.afterPropertiesSet());
        return map;
    }

}

写一个接受类

@Component
public class RedisMessageReceiver {

//前面配置的方法 每个都要有 这里就写一个示例
 public void iocDisable(String message) {

    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis 发布订阅,小功能大用处,真没那么废材!

    也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子。

    andyxh
  • 补习系列(13)-springboot redis 与发布订阅

    消息发布者是消息载体的生产者,其通过某些主题来向调度中心发送消息; 而消息订阅者会事先向调度中心订阅其"感兴趣"的主题,随后会获得新消息。

    美码师
  • Redis 发布订阅

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

    只喝牛奶的杀手
  • RabbitMQ六种队列模式之发布订阅模式

    在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者。本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种...

    黎明大大
  • 记录一次系统性能调优过程

    在线上环境,由于业务场景需要,要求程序能够在普通的4G机器中依然正常运行。而原来的环境配置为8核16G,微服务部署,一共有6个功能模块。而现在要求在一台4核4G...

    猿天地
  • 【9k字+】第二篇:进阶:掌握 Redis 的一些进阶操作(Linux环境)

    能够合理的查看,以及理解修改配置文件,能帮助我们更好的使用 Redis,下面按照 Redis 配置文件的顺序依次往下讲

    BWH_Steven
  • Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua

      昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:“看咱前面,想不到这么丑都有人要。”

    青石路
  • springboot集成redis实现消息发布订阅模式-跨多服务器

    基础配置参考 https://blog.csdn.net/llll234/article/details/80966952

    用户1518699
  • 通过 Redis 构建一个响应式架构

    Redis 是我遇到过的最强大、最通用的技术之一。遗憾的是,大多数人都只是将其作为一个优秀的缓存解决方案来使用。

    出其东门
  • Redisson 分布式锁实现之源码篇 → 为什么推荐用 Redisson 客户端

      单服务下,用 JDK 中的 synchronized 或 Lock 的实现类可实现对共享资源的并发访问

    青石路
  • 设计模式之发布订阅模式(2) Redis 发布/订阅模式

    Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了发布订阅模式。该功能提供两种信息机制, 分别是“发布订阅到频道”和“发布订阅到模式”。

    用户5546570
  • 一不小心肝出了4W字的Redis面试教程

    Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库、缓存、消息中间件,这么优秀的东西客定要一点一点的吃透它。

    Bug开发工程师
  • Redis原理篇

    前面我们说通过队列的rpush和blpop可以实现消息队列(队尾进队列出),没有任何元素可以弹出的时候,连接会被阻塞。 但是基于list实现的消息队列,不支持...

    编程之心
  • 【数据库】Redis进阶篇

    为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。简单介绍Redis中事务的使用方法以及它的局限性。

    用户3467126
  • 高并发系统设计-redis技术梳理

    架构师就是梳理技术,整理文档,落地技术方案,首先架构师需要梳理下redis能为我们解决什么问题,以及redis的技术门槛,redis的优势和缺点。

    35岁程序员那些事
  • Redis发布订阅:我想着应该是全网讲解最简单最通俗的文章了吧!

    可能小伙伴的工作年限大部分已经超过三年甚至四年五年,不知道是否有一种危机感,我们写了那么多的需求代码没有20w行也有个10w行了吧,但是出去找工作的时候不是笔试...

    我是阿沐
  • Redis(8)——发布/订阅与Stream

    发布/ 订阅系统 是 Web 系统中比较常用的一个功能。简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张...

    我没有三颗心脏
  • Redis-13Redis发布订阅

    当使用银行卡消费的时候,银行往往会通过微信、短信或邮件通知用户这笔交易的信 息,这便是一种发布订阅模式, 1这里的发布是交易信息的发布,订阅则是各个渠道。这在...

    小小工匠
  • Laravel实现redis发布-订阅

    如果说我们需要一个比较简单的这种机制,我们可以采用redis这个轻量级的订阅机制,我们可以参考redis的 Publish/Subscribe 机制,得到比较好...

    憧憬博客

扫码关注云+社区

领取腾讯云代金券