PubSub 在 Redis 中不工作

PubSub is not working in Redis

因为我在 Redis 中使用以下代码作为发布者和订阅者。我正在使用 redis 服务器版本 3.2.6 并且我使用以下 maven 依赖性从版本 2.9.0 的 redis java 客户端 jedis 连接,

 <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
                <type>jar</type>
                <scope>compile</scope>
</dependency>

这是我的代码,

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import redis.clients.jedis.Jedis;
//import redis.clients.jedis.BinaryJedisPubSub;
import redis.clients.jedis.JedisPubSub;


public class JavaProject extends JedisPubSub{

    public static void main(String[] args) throws IOException, InterruptedException {

        Jedis jedis = new Jedis("192.168.0.20");
        try {
            jedis.connect();

            System.out.println("Connected");
            String subChannel = "192168026*";

            JavaProject javaProject=new JavaProject();
            jedis.subscribe(javaProject,subChannel);
            System.out.println("Subscribed to topic");

            jedis.publish(subChannel, "Hi".getBytes());

            System.out.println("Published to topics");

        } 
        catch(Exception jce){

         jce.printStackTrace();

        }
        finally {
            jedis.close();
        }
        System.out.println("Program Completed");
        while(true){

        }

    }

    @Override
    public void onUnsubscribe(String arg0, int arg1) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onSubscribe(String arg0, int arg1) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPUnsubscribe(String arg0, int arg1) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPSubscribe(String arg0, int arg1) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPMessage(String arg0, String arg1, String arg2) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onMessage(String channel, String message) {
        System.out.println(message);
    }
}

当我执行上面的代码时,我得到以下输出 已连接

但它挂在 subscribe() 方法上,执行不会进一步移动到下一行 那么这段代码有什么问题?

谢谢

订阅需要一个专用的 Redis 连接,可能还需要一个专用线程。

应用订阅操作后,除订阅相关命令(SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE、PING 和 QUIT)外,不能在此连接上向 Redis 服务器发送其他命令。

对于 Jedis,订阅操作是阻塞的,因此它应该 运行 在一个单独的线程中。请注意,由 Jedis 触发的回调也会 运行 在该线程中。

再次订阅需要使用新线程

 public void subscribe() {
            new Thread(){
                Jedis jedis = new Jedis("localhost");
                public void run(){
                    jedis.subscribe(new JedisPubSub() {
                        @Override
                        public void onMessage(String channel, String message) {
                            super.onMessage(channel, message);
                        }
                    },"Channel");
                }
            }.start();
        }