Pozoroval jsem stejný problém, a to, že vlákno odběru se zablokuje, jakmile se přihlásíte k odběru. Abych to vyřešil, implementoval jsem optimalizovaného pub/sub klienta pomocí Netty a začlenil jej do Jedis forku. Není to komplexní řešení a neměl jsem čas ho skutečně dokončit, ale funguje pro základní odběry kanálů a vzorů. Základy jsou:
Získejte instanci pubsub pomocí:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Vydání/zrušení odběrů vzorů pomocí:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
můžete ignorovat vrácenou ChannelFuture, pokud nechcete mít 100% jistotu, že váš požadavek projde (je asynchronní).
Vydat/zrušit odběry kanálů pomocí:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Poté implementujte instance 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);
}
a zaregistrujte/zrušte registraci posluchačů pomocí:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub nikdy neblokuje a události jsou doručovány registrovaným SubListenerům asynchronně.
Vidlice je už trochu stará, takže vám v současné podobě nemusí být k užitku, ale můžete snadno stáhnout zdroj v tomto balíčku a postavit jej samostatně. Závislosti jsou Jedis a Netty.
Omlouvám se, že jsem neměl komplexnější řešení.