2017-01-06 9 views
1

私はRedisのPublisherとSubscriberに以下のコードを使用しています。ここでは、PubSubはRedisで動作していません

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

を私はRedisのサーバーバージョン3.2.6を使用していると私はMavenの依存下に使用して、バージョン2.9.0のRedisのJavaクライアントjedisから接続しています私は、実行時に私のコードは、

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()メソッドでハングアップすると、実行は次の行に移動しません このコードで何が間違っていますか?

おかげ

答えて

1

は、サブスクリプション、およびまた、おそらく専用のスレッドに専用のRedisの接続が必要です。

サブスクライブ操作が適用されると、サブスクリプション関連のコマンド(サブスクリプション、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE、PING、およびQUIT)を除いて、この接続のRedisサーバーには他のコマンドを送信できません。

Jedisでは、サブスクライブ操作がブロックされているため、別のスレッドで実行する必要があります。 Jedisによってトリガされたコールバックは、そのスレッドでも実行されることに注意してください。

関連する問題