同じ問題、つまり、サブスクライブするとサブスクライブするスレッドがブロックされることを確認しました。これに対処するために、Nettyを使用して最適化されたpub / subクライアントを実装し、ここでJedisフォークに組み込みました。これは包括的なソリューションではなく、実際に完成させる時間がありませんでしたが、基本的なチャネルとパターンのサブスクリプションで機能します。基本は次のとおりです。
以下を使用してpubsubインスタンスを取得します:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
以下を使用してパターンサブスクリプションを発行/キャンセルします:
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はブロックせず、イベントは登録されたサブリスナーに非同期で配信されます。
フォークは少し古くなっているため、現在の形式では役に立たない可能性がありますが、そのパッケージ内のソースを簡単にプルしてスタンドアロンでビルドできます。依存関係はJedisとNettyです。
申し訳ありませんが、これ以上の包括的なソリューションはありませんでした。