Ik merkte hetzelfde probleem op, namelijk dat de abonnementsthread blokkeert zodra je je abonneert. Om dit aan te pakken, heb ik een geoptimaliseerde pub/sub-client geïmplementeerd met Netty en deze hier in een Jedis-vork verwerkt. Het is geen alomvattende oplossing en ik heb geen tijd gehad om het echt af te maken, maar het werkt voor basiskanaal- en patroonabonnementen. De basis is:
Verkrijg een pubsub-instantie met:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Patroonabonnementen uitgeven/annuleren met:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
je kunt de geretourneerde ChannelFuture negeren, tenzij je er 100% zeker van wilt zijn dat je verzoek doorkomt (het is asynchroon).
Kanaalabonnementen uitgeven/annuleren met:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Implementeer vervolgens SubListener-instanties:
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);
}
en registreer/unregistreer de luisteraars met:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub blokkeert en gebeurtenissen worden nooit asynchroon aan de geregistreerde SubListeners geleverd.
De fork is nu een beetje oud, dus het is misschien niet handig voor je in zijn huidige vorm, maar je kunt gemakkelijk de broncode in dat pakket halen en het zelfstandig bouwen. De afhankelijkheden zijn Jedis en Netty.
Sorry dat ik geen uitgebreidere oplossing had.