Spring boot+redis實現消息發佈與訂閱

来源:https://www.cnblogs.com/aiaitie/archive/2020/04/25/12772176.html
-Advertisement-
Play Games

一.創建spring boot項目 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <depe ...


一.創建spring boot項目

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.41</version>
        </dependency>

二.編輯yml配置文件

server:
  port: 7888
# 日誌配置
logging:
  config: classpath:log/logback.xml
  level:
    cn.com.dhcc: info
    org.springframework: info
    org.springframework.web: info
    com.alibaba.nacos.client.naming: error
spring:
  redis:
     host: localhost
     port: 6379
     password: *********
     database: 1
     jedis:
      pool:
        max-idle: 8
        max-active: 8
        max-wait: -1
        min-idle: 0
     timeout: 5000

三.配置Redis

@Configuration
public class RedisConfiguration {

    /**
     * 實例化 RedisTemplate 對象
     *
     * @return
     */
    @Bean("RedisTemplateS")
    public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
        return redisTemplate;
    }

    /**
     * 設置數據存入 redis 的序列化方式,並開啟事務
     * 
     * @param redisTemplate
     * @param factory
     */
    private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
        // 如果不配置Serializer,那麼存儲的時候預設使用String,如果用User類型存儲,那麼會提示錯誤User can't cast to
        // String!
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<Object>(Object.class);
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        //redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 開啟事務
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.setConnectionFactory(factory);
    }

    /**
     * 註入封裝RedisTemplate @Title: redisUtil @return RedisUtil @date
     * 
     */
    @Bean(name = "redisUtils")
    public RedisUtils redisUtil(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate) {
        RedisUtils redisUtil = new RedisUtils();
        redisUtil.setRedisTemplate(redisTemplate);
        return redisUtil;
    }

四.編寫RedisUtil消息發佈方法

public class RedisUtils {
    private static final Logger log = LoggerFactory.getLogger(RedisUtils.class);

    private RedisTemplate<String, Object> redisTemplate;

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void publish(String channal ,Object obj) {
        redisTemplate.convertAndSend(channal,obj );
    }
}

五.配置消息監聽

@Configuration
public class RedisMessageListener {

    /**
     * 創建連接工廠
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapter2){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //接受消息的key
        container.addMessageListener(listenerAdapter,new PatternTopic("phone"));
        return container;
    }

    /**
     * 綁定消息監聽者和接收監聽的方法
     * @param receiver
     * @return
     */
    @Bean
    public MessageListenerAdapter listenerAdapter(ReceiverRedisMessage  receiver){
        return new MessageListenerAdapter(receiver,"receiveMessage");
    }

    /**
     * 註冊訂閱者
     * @param latch
     * @return
     */
    @Bean
    ReceiverRedisMessage receiver(CountDownLatch latch) {
        return new ReceiverRedisMessage(latch);
    }

    /**
     * 計數器,用來控制線程
     * @return
     */
    @Bean
    public CountDownLatch latch(){
        return new CountDownLatch(1);//指定了計數的次數 1
    }
}

六.消息訂閱方法

public class ReceiverRedisMessage {

    private static final Logger log = LoggerFactory.getLogger(ReceiverRedisMessage.class);
    private CountDownLatch latch;

    @Autowired
    public ReceiverRedisMessage(CountDownLatch latch) {
        this.latch = latch;
    }

    /**
     * 隊列消息接收方法
     *
     * @param jsonMsg
     */
    public void receiveMessage(String jsonMsg) {
        log.info("[開始消費REDIS消息隊列phone數據...]");
        try {
            log.info("監聽者收到消息:{}", jsonMsg);
            JSONObject exJson = JSONObject.parseObject(jsonMsg);
            User user = JSON.toJavaObject(exJson, User.class);
            System.out.println("轉化為對象 :"+user);
            log.info("[消費REDIS消息隊列phone數據成功.]");
        } catch (Exception e) {
            log.error("[消費REDIS消息隊列phone數據失敗,失敗信息:{}]", e.getMessage());
        }
        latch.countDown();
    }
}

七.定時消息發佈測試

@EnableScheduling
@Component
public class PublisherController {

    private static final Logger log = LoggerFactory.getLogger(PublisherController.class);

    @Autowired
    private RedisUtils redisUtils;

    @Scheduled(fixedRate = 5000)
    public String pubMsg() {
        User user=new User(1, "尚***", 26,"男","陝西省xxxx市xxxxxx縣");
        redisUtils.publish("phone", user);
        log.info("Publisher sendes Topic... ");
        return "success";
    }
}

八.測試結果
Spring boot+redis實現消息發佈與訂閱

九.發佈對象User實體

public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;
     .....................
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每次brew安裝新包的時候必先更新自身,網路慢的時候brew update無限卡死,雖然按一次ctrl C可以跳過,但有時候恰恰是brew本身版本導致的莫名其妙的問題出現,如果不把航空母艦更新了,後面也不會順利。 今天一怒之下,換了阿裡鏡像,果然一切迎刃而解了(原教派) 貼上iterm-bash腳本 ...
  • 時間久了,很多知識點都忘記了: Linux 系統中 文件許可權對應的數字: r = 4; w = 2; x = 1; 許可權可以使用 chmod 命令改變,具體使用可以參考manpages; 關於粘貼位的講解請參考:https://www.cnblogs.com/xuyaowen/p/sticky.ht ...
  • 回到目錄 共集放大電路的公共端為集電極,輸出信號Vo從射極取出。且由於共集放大電路的電壓放大倍數Av近似於1(即輸出電壓等於輸入電壓),因此常被稱作射極跟隨器(emitter-follower)。由於共集放大電路和共射放大電路的形式非常類似,僅僅是從不同的極取出輸出信號,因此也有:固定偏置、分壓偏置 ...
  • 當我們在一臺 Linux 系統中安裝了 Docker 後, 有時候會遇到下麵這樣的錯誤, 我們在運行 docker 的命令時必須加上 sudo, 例如: , 但是我們其實更希望能夠直接通過 來運行 docker 命令。 那麼我們可以如何解決這樣的問題呢? 可以參考如下步驟: 創建 docker 的用 ...
  • 配置 Hadoop 偽分散式 任務配置說明: VMware 15 Centos 6.5 java -jdk 1.8 hadoop-2.6.0-cdh5.14.0.tar.gz 第一步 自行安裝虛擬機 第二步 開始大配置 修改主機名和用戶名 vim /etc/sysconfig/network --( ...
  • 前言: 上篇文章 "HBase Filter 過濾器概述" 對HBase過濾器的組成及其家譜進行簡單介紹,本篇文章主要對HBase過濾器之比較器作一個補充介紹,也算是HBase Filter學習的必備低階魂技吧。本篇文中源碼基於HBase 1.1.2.2.6.5.0 292 HDP版本。 HBase ...
  • 日常運維中的坑真是防不勝防,不一小心就遇到別人給你挖的坑。最近又遇到經驗不足的DBA不知道從哪拷貝的配置文件(據說是當時參加某培訓機構視頻培訓是資料里的模板,真的是誤人子弟呀),其中把max_binlog_cache_size設置的只有2G,而MySQL早已將此參數的預設值調整的很大了(184467 ...
  • https://www.cnblogs.com/chenshishuo/p/5030029.html 本文從如何建立mysql索引以及介紹mysql的索引類型,再講mysql索引的利與弊,以及建立索引時需要註意的地方 首先:先假設有一張表,表的數據有10W條數據,其中有一條數據是nickname=' ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...