Ho osservato lo stesso problema, vale a dire che il thread di iscrizione si blocca una volta che ti iscrivi. Per risolvere questo problema, ho implementato un client pub/sub ottimizzato utilizzando Netty e l'ho incorporato in un fork Jedis qui. Non è una soluzione completa e non ho avuto il tempo di completarla davvero, ma funziona per le iscrizioni ai canali e ai pattern di base. Le basi sono:
Acquisisci un'istanza pubsub utilizzando:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Emettere/annullare le iscrizioni ai pattern utilizzando:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
puoi ignorare il ChannelFuture restituito a meno che tu non voglia essere certo al 100% che la tua richiesta venga completata (è asincrona).
Emettere/annullare le iscrizioni al canale utilizzando:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Quindi implementa le istanze 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);
}
e registra/annulla la registrazione degli ascoltatori utilizzando:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub non blocca mai e gli eventi vengono consegnati ai SubListener registrati in modo asincrono.
Il fork è un po' vecchio ora, quindi potrebbe non esserti utile nella sua forma attuale, ma puoi facilmente estrarre il sorgente in quel pacchetto e compilarlo autonomamente. Le dipendenze sono Jedis e Netty.
Mi dispiace non avere una soluzione più completa.