精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot+Redis自定義注解實現發布訂閱

數據庫 Redis
我們內部組件抽象了兩個方法,生產和消費,但這兩個方法邏輯截然不同,生產方法是暴露給serverice層接口調用,調用方在調用生產方法后能直接知道生產了幾條數據和成功與否。而消費方法是配合Spring生命周期函數服務啟動時建立常駐消費線程的。

前言

最近開發了一個內部消息組件,邏輯大體是通過定義注解 @MessageHub,在啟動時掃描全部bean中有使用了該注解的方法后臺創建一個常駐線程代理消費數據,當線程消費到數據就回寫到對應加了注解的方法里。

@Slf4j
@Service
public class RedisConsumerDemo {
    @MessageHub(topic = "${uptown.topic}", type = "REDIS_PUBSUB")
    public void consumer(Object message) {
        log.info("pubsub info {} ", message);
    }   
}

實現redis的隊列、stream方式實現都很簡單,唯獨發布訂閱方式,網上的demo全都是一個固定套路,通過redis容器注入監聽器,而且回寫非常死板。那么如何將這塊的邏輯統一呢。

常規寫法

常規實現reids的發布訂閱模式寫法一共三步

1.創建消息監聽器

@Bean 
public MessageListenerAdapter smsExpirationListener(TestSubscriber messageListener) {
    return new MessageListenerAdapter(messageListener, "onMessage");
}

2.創建訂閱器

@Component
public class TestSubscriber implements MessageListener {
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("get data :{}", msg);
    }
 
}

3.向redis容器中添加消息監聽器

@Configuration
public class RedisConfig {

    @Bean
    public RedisMessageListenerContainer container(
        RedisConnectionFactory redisConnectionFactory,
        MessageListenerAdapter smsExpirationListener) {
    
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        container.addMessageListener(smsExpirationListener, new PatternTopic("test"));
        return container;
    }
}

這樣定義非常簡單明了,但是有個問題是太代碼僵硬了,創建監聽者很不靈活,只能指定內部的onMessage方法,那么怎么才能融入到我們的內部消息流轉中間件里呢。

自定義注解實現

我們內部組件抽象了兩個方法,生產和消費,但這兩個方法邏輯截然不同,生產方法是暴露給serverice層接口調用,調用方在調用生產方法后能直接知道生產了幾條數據和成功與否。而消費方法是配合Spring生命周期函數服務啟動時建立常駐消費線程的。

/**
 * 生產消息
 */
Integer producer(MessageForm messageForm);

/**
 * 消費消息
 */
void consumer(ConsumerAdapterForm adapterForm);

生產消息當然很容易實現,只需要調用已經封裝好的convertAndSend方法。

stringRedisTemplate.convertAndSend(messageForm.getTopic(), messageForm.getMessage());

消費方法就有說法了,動態生成監聽者的場景下使用redis容器用代碼挨個注冊已經滿足不了了,但仔細過一遍源代碼就會發現,監聽類的構造方法的入參只有兩個,第一個需要回調的代理類,第二個消費到數據后回調的方法。

/**
 * Create a new {@link MessageListenerAdapter} for the given delegate.
 *
 * @param delegate the delegate object
 * @param defaultListenerMethod method to call when a message comes
 * @see #getListenerMethodName
 */
public MessageListenerAdapter(Object delegate, String defaultListenerMethod) {
   this(delegate);
   setDefaultListenerMethod(defaultListenerMethod);
}

方案有了,本質上就是把RedisMessageListenerContainer注入進來之后,掃描項目里所有加了 @MessageHub 的bean,包裝成監聽類加載到容器里就完事了。

怎么掃描的代碼就不再贅述了,實現Spring的生命周期函數BeanPostProcessor#postProcessAfterInitialization,在這里用AnnotationUtils判斷是否標注了注解。

MessageHub annotation = AnnotationUtils.findAnnotation(method, MessageHub.class);
if (annotation == null) {
    continue;
}

標注了后判斷如果是發布訂閱,進入發布訂閱的實現類。

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
@Service("redisPubSubProcessor")
public class RedisPubSubProcessor extends MessageHubServiceImpl {

    @Resource
    RedisMessageListenerContainer redisPubSubContainer;



    @Override
    public void produce(ProducerAdapterForm producerAdapterForm) {
        stringRedisTemplate.convertAndSend(producerAdapterForm.getTopic(), producerAdapterForm.getMessage());
    }

    @Override
    public void consume(ConsumerAdapterForm messageForm) {
        MessageListenerAdapter adapter = new MessageListenerAdapter(messageForm.getBean(), messageForm.getInvokeMethod().getName());
        adapter.afterPropertiesSet();
        redisPubSubContainer.addMessageListener(adapter, new PatternTopic(messageForm.getTopic()));
    }


    @Bean
    public RedisMessageListenerContainer redisPubSubContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

先將RedisMessageListenerContainer注入到Spring容器里,produce方法只需要調用下現成的api。consume方法由于上一步我們獲取了bean和對應的method,直接用MessageListenerAdapter的構造器創建出監聽器來,這里有坑,需要手動調用adapter.afterPropertiesSet()設置一些必要的屬性,這個在常規寫法里框架幫忙做了。如果不調用的話會出一些空指針之類的bug。

隨后把監聽器add到容器就實現了方法代理,背后的線程監聽到數據會回調到標注了 @MessageHub 的方法里

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-10-09 10:46:41

springboot緩存redis

2023-10-09 07:37:01

2023-10-11 07:57:23

springboot微服務

2023-10-24 13:48:50

自定義注解舉值驗證

2021-02-20 11:40:35

SpringBoot占位符開發技術

2024-12-27 15:37:23

2024-11-15 10:39:11

2022-12-02 07:28:58

Event訂閱模式Spring

2021-12-30 12:30:01

Java注解編譯器

2017-08-03 17:00:54

Springmvc任務執行器

2022-02-17 07:10:39

Nest自定義注解

2024-10-14 17:18:27

2023-03-03 09:11:12

高并發SpringBoot

2022-12-13 09:19:06

高并發SpringBoot

2023-09-04 08:12:16

分布式鎖Springboot

2025-03-05 10:49:32

2025-02-25 09:29:34

2025-05-08 08:30:00

Redis自定義序列化數據庫

2024-04-03 09:18:03

Redis數據結構接口防刷

2024-03-27 07:55:58

SpringRedis海量
點贊
收藏

51CTO技術棧公眾號

中文字幕av免费在线观看| 欧美成人黄色网址| 日本不卡视频一区二区| 亚洲欧美日韩一区在线观看| 在线观看日韩www视频免费| www.久久久久久久久久久| 黑人极品ⅴideos精品欧美棵| www亚洲一区| 成人网在线免费观看| 国产性xxxx高清| 久久婷婷蜜乳一本欲蜜臀| 日韩欧美国产三级电影视频| 国产日产欧美视频| av网站大全在线| 久久久久久久性| 91免费版黄色| 亚洲视频一区二区三区四区| 亚洲精一区二区三区| 日韩中文在线中文网在线观看 | 欧美日韩午夜视频| 日韩高清三区| 日韩一级免费一区| 狠狠干狠狠操视频| 亚洲天堂一区二区| 性做久久久久久久久| 日日噜噜夜夜狠狠久久丁香五月| 欧美欧美欧美| 91小视频在线免费看| 91精品婷婷国产综合久久蝌蚪| 在线观看亚洲黄色| 久久都是精品| 欧美一级在线亚洲天堂| 国产对白videos麻豆高潮| 久久久精品久久久久久96| 一区二区福利视频| 国产ts在线播放| 美女一区2区| 精品国产免费一区二区三区四区 | 成人免费看的视频| 91在线视频九色| 中文字幕欧美人妻精品一区蜜臀| 久久中文在线| 人人澡人人澡人人看欧美| 香蕉免费毛片视频| 最新日韩在线| 久久人人爽人人| 久久精品国产亚洲AV无码男同| 欧美1区视频| 美女视频黄免费的亚洲男人天堂| www.av免费| 在线观看日韩| 欧美成人中文字幕| 久草视频免费播放| 国产精品www994| 久久久久久久久久久亚洲| 国产中文字幕免费| 亚洲日本欧美| 2021国产精品视频| 永久免费无码av网站在线观看| 亚洲免费婷婷| 国产成人精品一区二区三区| 久久久精品毛片| 麻豆成人久久精品二区三区红| 国产精品久久久久久av福利软件| 国产三级理论片| 久久99久久99精品免视看婷婷| 成人福利在线视频| 国产成人三级在线播放| 成人精品小蝌蚪| 久久久久久九九| 国产精品无码2021在线观看| 欧美国产精品一区二区| 在线精品亚洲一区二区| 国产剧情在线| 亚洲18女电影在线观看| 男人亚洲天堂网| 看片一区二区| 精品久久久三级丝袜| a天堂视频在线观看| 亚洲精品国产动漫| 久久久精品网站| 日韩精品成人一区| 日韩黄色片在线观看| 成人乱人伦精品视频在线观看| 亚洲精品久久久蜜桃动漫| 91在线观看污| 国产精品亚洲天堂| 国产精品论坛| 欧美精品一二三| 国产性生活毛片| 色狮一区二区三区四区视频| 欧美国产日本高清在线 | 正在播放国产对白害羞| 欧美激情自拍| 国产97色在线|日韩| 国产乱子伦精品无码码专区| 99精品久久只有精品| 伊人久久青草| 一区一区三区| 精品久久一二三区| 林心如三级全黄裸体| 亚洲国产日韩欧美一区二区三区| 国产精品老女人精品视频| 性一交一乱一精一晶| 欧美极品美女视频| 日本人体一区二区| 亚洲男男av| 国产午夜精品全部视频播放 | 亚洲视频一区| 国产剧情久久久久久| 日本黄色一区二区三区| 国产精品国产三级国产普通话99 | 清纯唯美激情亚洲| 亚洲色图第一页| 久久久久亚洲av成人片| 麻豆精品在线播放| 蜜桃久久影院| 91jq激情在线观看| 日韩美女视频在线| fc2ppv在线播放| 视频在线在亚洲| 久久一区二区三区欧美亚洲| 不卡av免费观看| 欧美一区二区视频在线观看| 免费看91的网站| 欧美综合二区| 国产综合 伊人色| 亚洲妇熟xxxx妇色黄| 欧美日韩免费高清一区色橹橹 | 国产精品二三区| 久久久久久久少妇| 亚洲女娇小黑人粗硬| 久久久久久久久久国产| 亚洲不卡免费视频| 一区二区三区.www| 成人高清在线观看视频| 成人6969www免费视频| 日韩美女在线看| 日本a一级在线免费播放| 五月激情综合色| 久久精品无码专区| 亚洲国内欧美| 含羞草久久爱69一区| ****av在线网毛片| 亚洲精品98久久久久久中文字幕| 国产五月天婷婷| 成人av电影免费观看| 免费拍拍拍网站| 99re6热只有精品免费观看| 欧美日韩爱爱视频| 午夜精品久久久久久久99老熟妇| 亚洲美女免费在线| 亚洲av毛片在线观看| 欧美91大片| 高清视频一区| 激情视频网站在线播放色| 亚洲国产精品福利| 国产免费av一区| 国产亚洲女人久久久久毛片| 日本熟妇人妻中出| 91影院成人| 99久久伊人精品影院| 成人免费图片免费观看| 精品网站999www| 久久久久在线视频| 国产精品欧美久久久久无广告| 欧美黄色性生活| 一区二区电影在线观看| 国产精品v欧美精品v日韩精品| av电影免费在线看| 亚洲人成伊人成综合网久久久 | 日韩精品乱码久久久久久| 91欧美激情一区二区三区成人| 免费日韩中文字幕| 国产精品伦理久久久久久| 99久久99久久精品国产片| av老司机免费在线| 中文国产成人精品久久一| 99热这里只有精品在线| 午夜电影网一区| 日韩精品久久久久久久的张开腿让| 国模少妇一区二区三区| 欧美久久久久久久久久久久久| 久久av导航| 97中文在线| 欧洲亚洲两性| 精品视频9999| 免费在线国产| 日韩你懂的电影在线观看| 天堂а√在线中文在线新版| 成人欧美一区二区三区视频网页| 国产欧美视频一区| 蜜臀av性久久久久蜜臀aⅴ| 久草视频国产在线| 日产午夜精品一线二线三线| 国产精品日韩一区二区三区| julia一区二区三区中文字幕| 久久99精品视频一区97| 黄色网址在线播放| 精品国产麻豆免费人成网站| 久久精品99北条麻妃| 午夜精品久久久久久久久久| 国产传媒在线看| 91丨九色丨蝌蚪丨老版| 欧美污在线观看| 男男视频亚洲欧美| 中文字幕无码精品亚洲35| 91精品国产自产在线观看永久∴| 精品视频在线观看| 欧美一级片网址| 国产精品美女免费看| 国产网站在线| 久久6免费高清热精品| av资源在线观看免费高清| 亚洲精品国产品国语在线| 99久久久国产精品无码免费| 欧洲一区在线观看| www.国产com| 午夜精品国产更新| 欧产日产国产v| 亚洲色图一区二区三区| 欧美高清性xxxx| 成人高清免费观看| 99视频在线观看视频| 免费成人在线视频观看| 黄色片视频在线播放| 亚洲精品乱码| 国产精品www在线观看| 亚洲国产精品久久久久蝴蝶传媒| 日本视频一区在线观看| 亚洲瘦老头同性70tv| 国产亚洲欧美一区二区三区| 999久久久久久久久6666| 91在线精品播放| 韩国三级大全久久网站| 91免费欧美精品| 国色天香久久精品国产一区| 91视频-88av| 日韩精品视频中文字幕| 成人做爽爽免费视频| 图片一区二区| 96精品久久久久中文字幕| 精品中文字幕一区二区三区四区| 成人妇女淫片aaaa视频| 国产亚洲高清在线观看| 91欧美视频网站| 欧美成人精品午夜一区二区| 91久久精品www人人做人人爽 | 欧美成人a∨高清免费观看| 99精品在线视频观看| 欧美一三区三区四区免费在线看| 999免费视频| 精品三级在线观看| 人妻精品一区二区三区| 亚洲精品美女视频| 欧美大片aaa| 在线视频欧美日韩| 麻豆影视在线观看_| 久热精品视频在线免费观看| 色www永久免费视频首页在线| 欧美高清第一页| 亚洲美女炮图| 国产女同一区二区| 国产日韩一区二区三免费高清| 亚洲精品免费网站| 国产成人高清精品免费5388| 久久久神马电影| 欧美日韩在线二区| 久久久成人精品一区二区三区 | 日韩美女视频19| 美女福利视频在线观看| 亚洲va欧美va人人爽午夜| 神马久久久久久久| 欧美一区二区三区在线视频| 亚洲精品一区二区三区蜜桃| 亚洲精品视频免费| 在线中文资源天堂| 欧美巨乳在线观看| 亚洲欧美韩国| 91理论片午午论夜理片久久| 丁香五月缴情综合网| 日韩一区国产在线观看| 欧美91精品| 蜜臀视频一区二区三区| 国产精品资源在线观看| 亚洲乱码国产乱码精品精大量| 国产精品你懂的| 91午夜视频在线观看| 欧美久久久影院| 丰满人妻一区二区三区免费| 在线精品国产欧美| 超碰在线网站| 国产精品综合网站| 欧美黑白配在线| 欧美a级黄色大片| 人人狠狠综合久久亚洲| 日韩Av无码精品| 亚洲色图欧洲色图| 天天干在线播放| 精品国产乱码久久久久久闺蜜| 91porn在线观看| 欧美亚洲日本网站| 狂野欧美xxxx韩国少妇| 视频在线99| 国产亚洲激情| 成人做爰69片免费| 中文字幕在线观看一区二区| 欧美一区二区激情视频| 日韩精品一区二区三区中文不卡 | 久久久久久18| 欧美男女视频| 午夜精品福利一区二区| 亚洲一级在线| 中国xxxx性xxxx产国| 亚洲欧美福利一区二区| 伊人亚洲综合网| 亚洲免费高清视频| 免费h视频在线观看| 国产99在线免费| 欧美aⅴ99久久黑人专区| 手机看片一级片| 中文字幕第一区综合| 波多野结衣啪啪| 日韩大陆欧美高清视频区| 少妇av在线| 99精彩视频在线观看免费| 国产精品99在线观看| 色婷婷成人在线| 中文字幕巨乱亚洲| 国产性生活视频| 亚洲欧美另类在线观看| 黄视频免费在线看| 黑人巨大精品欧美一区二区小视频| 欧美三区在线| 中文在线字幕观看| 亚洲永久免费av| 不卡的日韩av| 欧美激情综合亚洲一二区| 在线综合色站| 日韩视频免费播放| 不卡高清视频专区| 精品欧美一区二区三区免费观看 | 88在线观看91蜜桃国自产| 日本网站在线免费观看视频| 成人h猎奇视频网站| 亚洲精品成人影院| 精产国品一二三区| 一区二区三区不卡视频在线观看 | 久久久久久久av麻豆果冻| 天堂网中文字幕| 伊人伊成久久人综合网小说 | 古典武侠综合av第一页| 国一区二区在线观看| 亚洲国产精品无码久久久久高潮| 午夜视黄欧洲亚洲| 免费理论片在线观看播放老| 国产精品视频久久久久| 久久在线电影| 黄页网站在线看| 精品国产999| 国产精品久久久久一区二区国产| 国产欧美精品日韩| 欧美成人中文| 你懂的在线观看网站| 色先锋资源久久综合| 中文日本在线观看| 97视频中文字幕| 国产色综合网| 亚洲色图 激情小说| 正在播放一区二区| 丁香花在线影院| 日韩三级在线播放| 国产精品中文字幕日韩精品| 99精品视频99| 日韩在线中文字| 欧美网色网址| 日本在线一二三区| 亚洲午夜电影网| www日韩tube| www 成人av com| 玖玖在线精品| 男人与禽猛交狂配| 精品亚洲国产视频| 中文字幕日本一区| 亚洲不卡中文字幕无码| 中文字幕巨乱亚洲| 欧美视频一二区| 国产精品久久色| 国产精品av久久久久久麻豆网| 波多野吉衣中文字幕| 91精品国产色综合久久不卡电影| 涩涩av在线| www国产无套内射com| 国产亚洲1区2区3区| 成人免费视频国产| 国产日产欧美精品| 国产欧美精品| 青娱乐av在线| 在线视频日本亚洲性| 久久亚洲道色|