java - PubSub 在 Redis 中不工作

标签 java redis jedis

因为我在 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 触发的回调也将在该线程中运行。

关于java - PubSub 在 Redis 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41499605/

相关文章:

java - 如何用java中给定的替换映射替换某些单词?

node.js - 如何在 Node.js 中同步处理回调?

redis - 有没有办法从 redis 获取所有禁用的 redis 命令的列表?

redis - Jedis java.lang.Long 不能转换为 [B

java - Bamboo 在分支上构建计划,但不在开发上(又名条件构建)

java - 使用 Jdk8Module 反序列化 LocalDate 可选会引发错误

java - 如何从java代码调用JavaScript函数android native

java - 使用 Java 将 Redis 数据库连接到 Azure 云

Redis 数据库在完成几乎所有任务后给出 "Connection refused"错误

java - 如何使用java获取redis db中的哈希列表?