동일한 문제, 즉 구독하면 구독 스레드가 차단된다는 것을 알게되었습니다. 이를 해결하기 위해 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입니다.
죄송합니다. 저는 더 포괄적 인 해결책이 없었습니다.