Zaobserwowałem ten sam problem, a mianowicie, że wątek subskrybujący blokuje się po subskrybowaniu. Aby rozwiązać ten problem, zaimplementowałem zoptymalizowanego klienta pub/sub za pomocą Netty i włączyłem go tutaj do widełek Jedis. Nie jest to kompleksowe rozwiązanie i nie miałem czasu go dokończyć, ale działa w przypadku podstawowych subskrypcji kanałów i wzorców. Podstawy to:
Uzyskaj instancję pubsub za pomocą:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Wydaj/anuluj subskrypcje wzorów za pomocą:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
możesz zignorować zwrócony ChannelFuture, chyba że chcesz mieć 100% pewność, że Twoje żądanie przejdzie (jest asynchroniczne).
Wydaj/anuluj subskrypcje kanałów za pomocą:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Następnie zaimplementuj instancje 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);
}
i zarejestruj/wyrejestruj słuchaczy za pomocą:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub nigdy nie blokuje, a zdarzenia są dostarczane do zarejestrowanych SubListenerów asynchronicznie.
Widelec jest teraz trochę stary, więc może nie być przydatny w obecnej formie, ale możesz łatwo ściągnąć źródła w tym pakiecie i zbudować je samodzielnie. Zależności to Jedis i Netty.
Przepraszamy, nie miałem bardziej kompleksowego rozwiązania.