2014-04-26 2 views
1

Java에서 Jedis 클라이언트를 사용하는 클라이언트간에 메시지를 전송하기 위해 Redis publish/subscribe를 사용하는 응용 프로그램이 있습니다. 사용자가 명령을 입력 할 때 런타임에 채널을 구독 할 수 있기를 원하지만 구독을 호출하는 스레드에서 구독을 차단하면 구독이 차단되는 경우 나중에 다른 채널을 구독하는 방법을 모르겠습니다. 원래 스레드에.동일한 스레드로 여러 채널 구독하기 Jedis

예 :

private PubSubListener psl = new PubSubListener(); 

public void onCommand(String[] args) { 
    subscribe(args[0]); 
} 

public void subscribe(String channel) { 
    Jedis jedis = jedisPool.getResource(); 

    jedis.subscribe(psl, channel); 
} 

이 명령은 다음 레디 스를 폴링하는 데 사용될 것이며, 나는 그 스레드가 더 이상 채널을 구독 할 수 없을 것입니다 전달 스레드를 제외하고 작동합니다.

답변

2

동일한 문제, 즉 구독하면 구독 스레드가 차단된다는 것을 알게되었습니다. 이를 해결하기 위해 Netty을 사용하여 최적화 된 pub/sub 클라이언트를 구현하고이를 Jedis 포크 here에 통합했습니다. 그것은 포괄적 인 솔루션이 아니다 나는 정말 마무리 할 시간이 없었어요,하지만 기본 채널 및 패턴 subscriptions.The 기본 작동하면 다음과 같습니다

가 사용 pubsub 인스턴스를 취득 :

public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout) 

문제/사용 패턴 구독을 취소 귀하의 요청이 (그것의 비동기)를 통해 얻을 수 100 % 확인하고 싶습니다 않는

public ChannelFuture psubscribe(String... patterns) 
public ChannelFuture punsubscribe(String... patterns) 

가 반환 된 ChannelFuture를 무시할 수 있습니다.

문제/사용 채널 구독을 취소

public ChannelFuture subscribe(String... channels) 
public ChannelFuture unsubscribe(String... channels) 

그런 구현 SubListener 인스턴스 :

public interface SubListener { 
    /** 
    * Callback when a message is published on a subscribed channel 
    * @param channel The channel the message was received on 
    * @param message The received message 
    */ 
    public void onChannelMessage(String channel, String message); 

    /** 
    * Callback when a message is published on a subscribed channel matching a subscribed pattern 
    * @param pattern The pattern that the channel matched 
    * @param channel The channel the message was received on 
    * @param message The received message 
    */ 
    public void onPatternMessage(String pattern, String channel, String message); 
} 

및 등록을 /를 사용하여 청취자의 등록을 취소 :

public void registerListener(SubListener listener) 
public void unregisterListener(SubListener listener) 

OptimizedPubSub 결코 블록 및 이벤트 등록 된 SubListener에 비동기 적으로 전달됩니다.

포크가 조금 오래되었으므로 현재 양식에서는 유용하지 않을 수 있지만 해당 패키지의 소스를 쉽게 가져 와서 독립 실행 형으로 빌드 할 수 있습니다. 종속성은 Jedis와 Netty입니다.

죄송합니다. 저는 더 포괄적 인 해결책이 없었습니다.