1. 程式人生 > >Redis學習筆記之十:Redis用作訊息佇列

Redis學習筆記之十:Redis用作訊息佇列

package org.yamikaze.redis.messsage.subscribe;

import org.yamikaze.redis.test.MyJedisFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

import java.util.concurrent.TimeUnit;

/**
 * 訊息訂閱方客戶端
 * @author yamikaze
 */
public class SubscribeClient {

    private Jedis jedis;
    private static final String EXIT_COMMAND = "exit";

    public SubscribeClient() {
        jedis = MyJedisFactory.getLocalJedis();
    }

    public void subscribe(String ...channel) {
        if(channel == null || channel.length <= 0) {
            return;
        }
        //訊息處理,接收到訊息時如何處理
        JedisPubSub jps = new JedisPubSub() {
            /**
             * JedisPubSub類是一個沒有抽象方法的抽象類,裡面方法都是一些空實現
             * 所以可以選擇需要的方法覆蓋,這兒使用的是SUBSCRIBE指令,所以覆蓋了onMessage
             * 如果使用PSUBSCRIBE指令,則覆蓋onPMessage方法
             * 當然也可以選擇BinaryJedisPubSub,同樣是抽象類,但方法引數為byte[]
             */
            @Override
            public void onMessage(String channel, String message) {
                if(Publisher.CHANNEL_KEY.equals(channel)) {
                    System.out.println("接收到訊息: channel : " + message);
                    //接收到exit訊息後退出
                    if(EXIT_COMMAND.equals(message)) {
                        System.exit(0);
                    }

                }
            }

            /**
             * 訂閱時
             */
            @Override
            public void onSubscribe(String channel, int subscribedChannels) {
                if(Publisher.CHANNEL_KEY.equals(channel)) {
                    System.out.println("訂閱了頻道:" + channel);
                }
            }
        };
        //可以訂閱多個頻道 當前執行緒會阻塞在這兒
        jedis.subscribe(jps, channel);
    }

    public static void main(String[] args) {
        SubscribeClient client = new SubscribeClient();
        client.subscribe(Publisher.CHANNEL_KEY);
        //並沒有 unsubscribe方法
        //相應的也沒有punsubscribe方法
    }
}