1. 首先需要一個訊息監聽器類
package com.sogou.baike.testimport.testSubscribe;import redis.clients.jedis.JedisPubSub;/** * Created by denglinjie on 2016/6/29. */public class RedisMsgPubSubListener extends JedisPubSub { @Override public void unsubscribe() { super.unsubscribe(); } @Override public void unsubscribe(String... channels) { super.unsubscribe(channels); } @Override public void subscribe(String... channels) { super.subscribe(channels); } @Override public void psubscribe(String... patterns) { super.psubscribe(patterns); } @Override public void punsubscribe() { super.punsubscribe(); } @Override public void punsubscribe(String... patterns) { super.punsubscribe(patterns); } @Override public void onMessage(String channel, String message) { System.out.println("channel:" + channel + "receives message :" + message); this.unsubscribe(); } @Override public void onPMessage(String pattern, String channel, String message) { } @Override public void onSubscribe(String channel, int subscribedChannels) { System.out.println("channel:" + channel + "is been subscribed:" + subscribedChannels); } @Override public void onPUnsubscribe(String pattern, int subscribedChannels) { } @Override public void onPSubscribe(String pattern, int subscribedChannels) { } @Override public void onUnsubscribe(String channel, int subscribedChannels) { System.out.println("channel:" + channel + "is been unsubscribed:" + subscribedChannels); }}該類需要繼承 JedisPubSub ,並實現其抽象方法,通過方法的名稱很清楚的看出來,這個監聽器是用來訂閱一個頻道,在訂閱該頻道,取消訂閱,收到訊息等狀態會對應調用相關的方法
2. 訂閱測試類別
public class TestSubscribe { @Test public void testSubscribe() throws Exception{ Jedis jedis = new Jedis("localhost"); RedisMsgPubSubListener listener = new RedisMsgPubSubListener(); jedis.subscribe(listener, "redisChatTest"); //other code }}該類實現對頻道redisChatTest的訂閱監聽,頻道的訂閱,取消訂閱,收到訊息都會調用listener對象的對應方法
注意:subscribe是一個阻塞的方法,在取消訂閱該頻道前,會一直阻塞在這,只有當取消了訂閱才會執行下面的other code,參考上面代碼,我在onMessage裡面收到訊息後,調用了this.unsubscribe(); 來取消訂閱,這樣才會執行後面的other code
3. 發布訊息測試類別
Public class TestPublish { @Test public void testPublish() throws Exception{ Jedis jedis = new Jedis("localhost"); jedis.publish("redisChatTest", "我是天才"); Thread.sleep(5000); jedis.publish("redisChatTest", "我牛逼"); Thread.sleep(5000); jedis.publish("redisChatTest", "哈哈"); }}這個類向頻道redisChatTest發布訊息,第二步因為訂閱了該頻道,所以會收到該訊息。