Eu observei o mesmo problema, ou seja, que o segmento de assinatura é bloqueado quando você se inscreve. Para resolver isso, implementei um cliente pub/sub otimizado usando Netty e o incorporei em um fork Jedis aqui. Não é uma solução abrangente e não tive tempo de realmente terminá-la, mas funciona para assinaturas básicas de canal e padrão. O básico é:
Adquira uma instância pubsub usando:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Emitir/cancelar assinaturas padrão usando:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
você pode ignorar o ChannelFuture retornado, a menos que queira ter 100% de certeza de que sua solicitação será concluída (é assíncrona).
Emitir/cancelar assinaturas de canais usando:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
Em seguida, implemente instâncias de 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 registre/desregistre os ouvintes usando:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
O OptimizedPubSub nunca bloqueia e os eventos são entregues aos SubListeners registrados de forma assíncrona.
O fork é um pouco antigo agora, então pode não ser útil para você em sua forma atual, mas você pode facilmente extrair o código-fonte desse pacote e construí-lo de forma independente. As dependências são Jedis e Netty.
Desculpe, eu não tinha uma solução mais abrangente.