PubSub не работает в Redis

Поскольку я использую приведенный ниже код для издателя и подписчика в Redis. Я использую сервер Redis версии 3.2.6, и я подключаюсь к Redis Java-клиенту jedis версии 2.9.0, используя приведенную ниже зависимость maven,

 <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);
    }
}

когда я выполняю приведенный выше код, я получаю вывод ниже Connected

Но он зависает на методе subscribe(), выполнение не переходит дальше на следующую строку Так что же не так в этом коде?

Спасибо


person user3406181    schedule 06.01.2017    source источник


Ответы (2)


Вам нужно выделенное соединение Redis для подписки, а также, возможно, выделенный поток.

После применения операции подписки никакие другие команды не могут быть отправлены на сервер Redis по этому соединению, кроме команд, связанных с подпиской (SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE, PING и QUIT).

В Jedis операция подписки блокируется, поэтому она должна выполняться в отдельном потоке. Обратите внимание, что обратные вызовы, запускаемые Jedis, также будут выполняться в этом потоке.

person Didier Spezia    schedule 06.01.2017

Вам нужно использовать новую тему при подписке снова

 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();
        }
person Ike    schedule 04.12.2018