Redis
 sql >> Database >  >> NoSQL >> Redis

Iscriviti a più canali con lo stesso thread Jedis

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.