Забелязах същия проблем, а именно, че нишката за абонамент се блокира, след като се абонирате. За да се справя с това, внедрих оптимизиран клиент на pub/sub, използвайки Netty и го включих в джедайската вилка тук. Това не е изчерпателно решение и не съм имал време наистина да го завърша, но работи за основни абонаменти за канали и шаблони. Основните неща са:
Придобийте екземпляр на pubsub, като използвате:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
Издаване/Анулиране на абонаменти за шаблон с помощта на:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
можете да игнорирате върнатия ChannelFuture, освен ако не искате да сте 100% сигурни, че заявката ви ще премине (асинхронно е).
Издаване/анулиране на абонаменти за канали с помощта на:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
След това имплементирайте екземпляри на 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);
}
и регистрирайте/отменете регистрацията на слушателите, като използвате:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
OptimizedPubSub никога не блокира и събитията се доставят на регистрираните SubLsteners асинхронно.
Форкът вече е малко стар, така че може да не ви е полезен в сегашната си форма, но можете лесно да изтеглите източника в този пакет и да го изградите самостоятелно. Зависимостите са Джедаи и Нети.
Съжалявам, че нямах по-изчерпателно решение.