Springboot 使用Redis發(fā)布/訂閱模式

1.新增依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.49</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.配置redis

  1. 配置連接

    spring:
        redis:
            host: localhost
            port: 6379
            password: root
    
  2. 發(fā)布者配置

    @Configuration
    public class PublisherConfig {
        @Bean
        public RedisTemplate<String, Object> redisMessageTemplate(RedisConnectionFactory connectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);
            template.setDefaultSerializer(new FastJsonRedisSerializer<>(Object.class));
            return template;
        }
    }
    
  3. 訂閱者配置

    @Configuration
    public class ReceiverConfig {
    
        @Bean
        public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter userListenerAdapter,MessageListenerAdapter goodsListenerAdapter) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.addMessageListener(userListenerAdapter, new PatternTopic("user"));
            container.addMessageListener(goodsListenerAdapter, new PatternTopic("goods"));
            return container;
        }
    
        @Bean
        public MessageListenerAdapter userListenerAdapter(UserReceiver receiver) {
            return new MessageListenerAdapter(receiver, "receiveMessage");
        }
    
        @Bean
        public MessageListenerAdapter goodsListenerAdapter(GoodsReceiver receiver) {
            return new MessageListenerAdapter(receiver, "receiveMessage");
        }
    
        @Bean
        public UserReceiver userReceiver() {
            return new UserReceiver();
        }
    
        @Bean
        public GoodsReceiver goodsReceiver() {
            return new GoodsReceiver();
        }
    
    }
    

3.消息模型

@Data
public class RedisMessage implements Serializable {
    public String msgId;
    public long createStamp;
}
@EqualsAndHashCode(callSuper = true)
@Data
public class GoodsMessage extends RedisMessage {
    private String goodsType;
    private String number;
}
@EqualsAndHashCode(callSuper = true)
@Data
public class UserMessage extends RedisMessage {
    private String userId;
    private String username;
    private String password;
}

4.消息發(fā)布者

@Service
public class Publisher {
    private final RedisTemplate<String, Object> redisMessageTemplate;

    @Autowired
    public Publisher(RedisTemplate<String, Object> redisMessageTemplate) {
        this.redisMessageTemplate = redisMessageTemplate;
    }

    public void pushMessage(String topic, RedisMessage message) {
        redisMessageTemplate.convertAndSend(topic,message);
    }
}

5.消息訂閱者

public abstract class AbstractReceiver {
    public abstract void receiveMessage(Object message);
}
@Slf4j
public class GoodsReceiver extends AbstractReceiver {
    @Override
    public void receiveMessage(Object message) {
        log.info("接收到商品消息:{}", JSON.toJSONString(message));
    }
}
@Slf4j
public class UserReceiver extends AbstractReceiver {
    @Override
    public void receiveMessage(Object message) {
        log.info("接收到用戶消息:{}", JSON.toJSONString(message));
    }
}

6.測試

@Test
public void pushMessage() {
    UserMessage userMessage = new UserMessage();
    userMessage.setMsgId(UUID.randomUUID().toString().replace("-",""));
    userMessage.setUserId("1");
    userMessage.setUsername("admin");
    userMessage.setUsername("root");
    userMessage.setCreateStamp(System.currentTimeMillis());
    publisher.pushMessage("user",userMessage);
    GoodsMessage goodsMessage = new GoodsMessage();
    goodsMessage.setMsgId(UUID.randomUUID().toString().replace("-",""));
    goodsMessage.setGoodsType("蘋果");
    goodsMessage.setNumber("十箱");
    goodsMessage.setCreateStamp(System.currentTimeMillis());
    publisher.pushMessage("goods",goodsMessage);
}

測試結(jié)果如下:

2018-09-28 12:02:16.281  INFO 25244 --- [           main] org.qiqiang.redismq.core.PublisherTest   : Started PublisherTest in 2.889 seconds (JVM running for 3.723)
2018-09-28 12:02:16.544  INFO 25244 --- [    container-2] org.qiqiang.redismq.core.UserReceiver    : 接收到用戶消息:"{\"createStamp\":1538107336525,\"msgId\":\"62c60489199545209f036d5eeffc353e\",\"userId\":\"1\",\"username\":\"root\"}"
2018-09-28 12:02:16.547  INFO 25244 --- [    container-3] org.qiqiang.redismq.core.GoodsReceiver   : 接收到商品消息:"{\"createStamp\":1538107336543,\"goodsType\":\"蘋果\",\"msgId\":\"b0ee90c6635444c490afc691a3c5cf74\",\"number\":\"十箱\"}"
2018-09-28 12:02:16.551  INFO 25244 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@1a4927d6: startup date [Fri Sep 28 12:02:13 CST 2018]; root of context hierarchy
2018-09-28 12:02:16.552  INFO 25244 --- [       Thread-2] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 2147483647

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末二驰,一起剝皮案震驚了整個濱河市孽鸡,隨后出現(xiàn)的幾起案子限次,更是在濱河造成了極大的恐慌腮恩,老刑警劉巖吓揪,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡怎,死亡現(xiàn)場離奇詭異脑融,居然都是意外死亡阅虫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門褒颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柒巫,“玉大人,你說我怎么就攤上這事谷丸”ぬ停” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵刨疼,是天一觀的道長泉唁。 經(jīng)常有香客問我,道長揩慕,這世上最難降的妖魔是什么亭畜? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮迎卤,結(jié)果婚禮上拴鸵,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好劲藐,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布八堡。 她就那樣靜靜地躺著,像睡著了一般聘芜。 火紅的嫁衣襯著肌膚如雪秕重。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天厉膀,我揣著相機與錄音溶耘,去河邊找鬼。 笑死服鹅,一個胖子當(dāng)著我的面吹牛凳兵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播企软,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼庐扫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仗哨?” 一聲冷哼從身側(cè)響起形庭,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厌漂,沒想到半個月后萨醒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡苇倡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年富纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨椒。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡晓褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出综慎,到底是詐尸還是另有隱情涣仿,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布示惊,位于F島的核電站好港,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涝涤。R本人自食惡果不足惜媚狰,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阔拳。 院中可真熱鬧,春花似錦、人聲如沸糊肠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽货裹。三九已至嗤形,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧圆,已是汗流浹背赋兵。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搔预,地道東北人霹期。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像拯田,于是被迫代替她去往敵國和親历造。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理船庇,服務(wù)發(fā)現(xiàn)吭产,斷路器,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,848評論 6 342
  • SpringBoot對常用的數(shù)據(jù)庫支持外鸭轮,對NoSQL 數(shù)據(jù)庫也進行了封裝自動化臣淤。 redis介紹 Redis是目...
    余平的余_余平的平閱讀 598評論 0 2
  • 3月31號,拖好朋友小橘子的福窃爷,我得以同她一起參加她好朋友嬌嬌和兵兵的婚禮,她跟我說的時候是在那一周前荒典,就簡單的說...
    ECHO510322雙兒閱讀 1,201評論 0 0
  • 風(fēng)拂動順溜的發(fā)絲 劃出了優(yōu)美的弧線 悠長身影被西沉的落日拉的更長 沒有任何的語言 背影終于消失在轉(zhuǎn)角處
    拾封人閱讀 171評論 0 1