Search in sources :

Example 1 with PubSubConnectionEntry

use of org.redisson.pubsub.PubSubConnectionEntry in project redisson by redisson.

the class RedissonPatternTopic method removeAllListeners.

@Override
public void removeAllListeners() {
    AsyncSemaphore semaphore = subscribeService.getSemaphore(channelName);
    acquire(semaphore);
    PubSubConnectionEntry entry = subscribeService.getPubSubEntry(channelName);
    if (entry == null) {
        semaphore.release();
        return;
    }
    if (entry.hasListeners(channelName)) {
        subscribeService.unsubscribe(PubSubType.PUNSUBSCRIBE, channelName).toCompletableFuture().join();
    }
    semaphore.release();
}
Also used : PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) AsyncSemaphore(org.redisson.pubsub.AsyncSemaphore)

Example 2 with PubSubConnectionEntry

use of org.redisson.pubsub.PubSubConnectionEntry in project redisson by redisson.

the class RedissonTopic method removeAllListeners.

@Override
public void removeAllListeners() {
    AsyncSemaphore semaphore = subscribeService.getSemaphore(channelName);
    acquire(semaphore);
    PubSubConnectionEntry entry = subscribeService.getPubSubEntry(channelName);
    if (entry == null) {
        semaphore.release();
        return;
    }
    if (entry.hasListeners(channelName)) {
        subscribeService.unsubscribe(PubSubType.UNSUBSCRIBE, channelName).toCompletableFuture().join();
    }
    semaphore.release();
}
Also used : PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) AsyncSemaphore(org.redisson.pubsub.AsyncSemaphore)

Example 3 with PubSubConnectionEntry

use of org.redisson.pubsub.PubSubConnectionEntry in project redisson by redisson.

the class RedissonReactiveSubscription method receive.

@Override
public Flux<Message<ByteBuffer, ByteBuffer>> receive() {
    if (flux.get() != null) {
        return flux.get();
    }
    Flux<Message<ByteBuffer, ByteBuffer>> f = Flux.create(emitter -> {
        emitter.onRequest(n -> {
            monosListener.addListener(() -> {
                BaseRedisPubSubListener listener = new BaseRedisPubSubListener() {

                    @Override
                    public void onPatternMessage(CharSequence pattern, CharSequence channel, Object message) {
                        if (!patterns.containsKey(new ChannelName(pattern.toString()))) {
                            return;
                        }
                        emitter.next(new PatternMessage<>(ByteBuffer.wrap(pattern.toString().getBytes()), ByteBuffer.wrap(channel.toString().getBytes()), ByteBuffer.wrap((byte[]) message)));
                    }

                    @Override
                    public void onMessage(CharSequence channel, Object msg) {
                        if (!channels.containsKey(new ChannelName(channel.toString()))) {
                            return;
                        }
                        emitter.next(new ChannelMessage<>(ByteBuffer.wrap(channel.toString().getBytes()), ByteBuffer.wrap((byte[]) msg)));
                    }
                };
                disposable = () -> {
                    for (Entry<ChannelName, PubSubConnectionEntry> entry : channels.entrySet()) {
                        entry.getValue().removeListener(entry.getKey(), listener);
                    }
                    for (Entry<ChannelName, Collection<PubSubConnectionEntry>> entry : patterns.entrySet()) {
                        for (PubSubConnectionEntry pubSubConnectionEntry : entry.getValue()) {
                            pubSubConnectionEntry.removeListener(entry.getKey(), listener);
                        }
                    }
                };
                for (Entry<ChannelName, PubSubConnectionEntry> entry : channels.entrySet()) {
                    entry.getValue().addListener(entry.getKey(), listener);
                }
                for (Entry<ChannelName, Collection<PubSubConnectionEntry>> entry : patterns.entrySet()) {
                    for (PubSubConnectionEntry pubSubConnectionEntry : entry.getValue()) {
                        pubSubConnectionEntry.addListener(entry.getKey(), listener);
                    }
                }
                emitter.onDispose(disposable);
            });
        });
    });
    if (flux.compareAndSet(null, f)) {
        return f;
    }
    return flux.get();
}
Also used : PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) ChannelName(org.redisson.client.ChannelName) BaseRedisPubSubListener(org.redisson.client.BaseRedisPubSubListener)

Example 4 with PubSubConnectionEntry

use of org.redisson.pubsub.PubSubConnectionEntry in project redisson by redisson.

the class RedissonReactiveSubscription method unsubscribe.

@Override
public Mono<Void> unsubscribe(ByteBuffer... channels) {
    monosListener.acquire();
    return Mono.defer(() -> {
        List<CompletableFuture<?>> futures = new ArrayList<>(channels.length);
        for (ByteBuffer channel : channels) {
            ChannelName cn = toChannelName(channel);
            CompletableFuture<Codec> f = subscribeService.unsubscribe(cn, PubSubType.UNSUBSCRIBE);
            f = f.whenComplete((res, e) -> {
                synchronized (RedissonReactiveSubscription.this.channels) {
                    PubSubConnectionEntry entry = RedissonReactiveSubscription.this.channels.get(cn);
                    if (!entry.hasListeners(cn)) {
                        RedissonReactiveSubscription.this.channels.remove(cn);
                    }
                }
            });
            futures.add(f);
        }
        CompletableFuture<Void> future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        future = future.whenComplete((r, e) -> {
            monosListener.release();
        });
        return Mono.fromFuture(future);
    });
}
Also used : PubSubType(org.redisson.client.protocol.pubsub.PubSubType) PublishSubscribeService(org.redisson.pubsub.PublishSubscribeService) java.util(java.util) Disposable(reactor.core.Disposable) Codec(org.redisson.client.codec.Codec) PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) ConnectionManager(org.redisson.connection.ConnectionManager) ByteArrayCodec(org.redisson.client.codec.ByteArrayCodec) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Mono(reactor.core.publisher.Mono) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicReference(java.util.concurrent.atomic.AtomicReference) Collectors(java.util.stream.Collectors) ByteBuffer(java.nio.ByteBuffer) StandardCharsets(java.nio.charset.StandardCharsets) RedisPubSubListener(org.redisson.client.RedisPubSubListener) SubscriptionListener(org.springframework.data.redis.connection.SubscriptionListener) BaseRedisPubSubListener(org.redisson.client.BaseRedisPubSubListener) Flux(reactor.core.publisher.Flux) ReactiveSubscription(org.springframework.data.redis.connection.ReactiveSubscription) Entry(java.util.Map.Entry) ChannelName(org.redisson.client.ChannelName) CompletableFuture(java.util.concurrent.CompletableFuture) Codec(org.redisson.client.codec.Codec) ByteArrayCodec(org.redisson.client.codec.ByteArrayCodec) PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) ChannelName(org.redisson.client.ChannelName) ByteBuffer(java.nio.ByteBuffer)

Example 5 with PubSubConnectionEntry

use of org.redisson.pubsub.PubSubConnectionEntry in project redisson by redisson.

the class RedissonReactiveSubscription method pSubscribe.

@Override
public Mono<Void> pSubscribe(ByteBuffer... patterns) {
    monosListener.acquire();
    return Mono.defer(() -> {
        List<CompletableFuture<?>> futures = new ArrayList<>();
        for (ByteBuffer channel : patterns) {
            ChannelName cn = toChannelName(channel);
            CompletableFuture<Collection<PubSubConnectionEntry>> f = subscribeService.psubscribe(cn, ByteArrayCodec.INSTANCE, subscriptionListener);
            f = f.whenComplete((res, e) -> RedissonReactiveSubscription.this.patterns.put(cn, res));
            futures.add(f);
        }
        CompletableFuture<Void> future = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        future = future.whenComplete((r, e) -> {
            monosListener.release();
        });
        return Mono.fromFuture(future);
    });
}
Also used : PubSubType(org.redisson.client.protocol.pubsub.PubSubType) PublishSubscribeService(org.redisson.pubsub.PublishSubscribeService) java.util(java.util) Disposable(reactor.core.Disposable) Codec(org.redisson.client.codec.Codec) PubSubConnectionEntry(org.redisson.pubsub.PubSubConnectionEntry) ConnectionManager(org.redisson.connection.ConnectionManager) ByteArrayCodec(org.redisson.client.codec.ByteArrayCodec) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Mono(reactor.core.publisher.Mono) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicReference(java.util.concurrent.atomic.AtomicReference) Collectors(java.util.stream.Collectors) ByteBuffer(java.nio.ByteBuffer) StandardCharsets(java.nio.charset.StandardCharsets) RedisPubSubListener(org.redisson.client.RedisPubSubListener) SubscriptionListener(org.springframework.data.redis.connection.SubscriptionListener) BaseRedisPubSubListener(org.redisson.client.BaseRedisPubSubListener) Flux(reactor.core.publisher.Flux) ReactiveSubscription(org.springframework.data.redis.connection.ReactiveSubscription) Entry(java.util.Map.Entry) ChannelName(org.redisson.client.ChannelName) CompletableFuture(java.util.concurrent.CompletableFuture) ChannelName(org.redisson.client.ChannelName) ByteBuffer(java.nio.ByteBuffer)

Aggregations

PubSubConnectionEntry (org.redisson.pubsub.PubSubConnectionEntry)8 BaseRedisPubSubListener (org.redisson.client.BaseRedisPubSubListener)6 ChannelName (org.redisson.client.ChannelName)6 CompletableFuture (java.util.concurrent.CompletableFuture)5 ByteBuffer (java.nio.ByteBuffer)4 StandardCharsets (java.nio.charset.StandardCharsets)4 java.util (java.util)4 Entry (java.util.Map.Entry)4 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)4 AtomicReference (java.util.concurrent.atomic.AtomicReference)4 Collectors (java.util.stream.Collectors)4 RedisPubSubListener (org.redisson.client.RedisPubSubListener)4 ByteArrayCodec (org.redisson.client.codec.ByteArrayCodec)4 Codec (org.redisson.client.codec.Codec)4 PubSubType (org.redisson.client.protocol.pubsub.PubSubType)4 ConnectionManager (org.redisson.connection.ConnectionManager)4 PublishSubscribeService (org.redisson.pubsub.PublishSubscribeService)4 ReactiveSubscription (org.springframework.data.redis.connection.ReactiveSubscription)4 SubscriptionListener (org.springframework.data.redis.connection.SubscriptionListener)4 Disposable (reactor.core.Disposable)4