Jeg observerede det samme problem, nemlig at abonnementstråden blokerer, når du abonnerer. For at løse dette implementerede jeg en optimeret pub/sub-klient ved hjælp af Netty og inkorporerede den i en Jedis-gaffel her. Det er ikke en omfattende løsning, og jeg har ikke haft tid til virkelig at gøre det færdigt, men det virker for grundlæggende kanal- og mønsterabonnementer. Det grundlæggende er:
Hent en pubsub-instans ved hjælp af:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Udsted/annuller mønsterabonnementer ved hjælp af:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
du kan ignorere den returnerede ChannelFuture, medmindre du vil være 100 % sikker på, at din anmodning kommer igennem (den er asynkron).
Udsted/annuller kanalabonnementer ved hjælp af:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Implementer derefter SubListener-forekomster:
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);
}
og tilmeld/afregistrer lytterne ved hjælp af:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub blokerer aldrig, og begivenheder leveres til de registrerede underlyttere asynkront.
Gaflen er lidt gammel nu, så den er måske ikke nyttig for dig i sin nuværende form, men du kan nemt trække kilden i den pakke og bygge den selvstændig. Afhængighederne er Jedis og Netty.
Beklager, at jeg ikke havde en mere omfattende løsning.