private <C, B> Flux<Message<C, B>> doReceive(SerializationPair<C> channelSerializer, SerializationPair<B> messageSerializer, Mono<ReactiveSubscription> subscription, ByteBuffer[] patterns, ByteBuffer[] channels) { Flux<Message<ByteBuffer, ByteBuffer>> messageStream = subscription.flatMapMany(it -> { Mono<Void> subscribe = subscribe(patterns, channels, it); MonoProcessor<ChannelMessage<ByteBuffer, ByteBuffer>> terminalProcessor = MonoProcessor.create(); return it.receive().mergeWith(subscribe.then(Mono.defer(() -> { getSubscribers(it).registered(); return Mono.empty(); }))).doOnCancel(() -> { Subscribers subscribers = getSubscribers(it); if (subscribers.unregister()) { subscriptions.remove(it); it.unsubscribe().subscribe(v -> terminalProcessor.onComplete(), terminalProcessor::onError); } }).mergeWith(terminalProcessor); }); return messageStream .map(message -> readMessage(channelSerializer.getReader(), messageSerializer.getReader(), message)); }
private <C, B> Flux<Message<C, B>> doReceive(SerializationPair<C> channelSerializer, SerializationPair<B> messageSerializer, Mono<ReactiveSubscription> subscription, ByteBuffer[] patterns, ByteBuffer[] channels) { Flux<Message<ByteBuffer, ByteBuffer>> messageStream = subscription.flatMapMany(it -> { Mono<Void> subscribe = subscribe(patterns, channels, it); MonoProcessor<ChannelMessage<ByteBuffer, ByteBuffer>> terminalProcessor = MonoProcessor.create(); return it.receive().mergeWith(subscribe.then(Mono.defer(() -> { getSubscribers(it).registered(); return Mono.empty(); }))).doOnCancel(() -> { Subscribers subscribers = getSubscribers(it); if (subscribers.unregister()) { subscriptions.remove(it); it.unsubscribe().subscribe(v -> terminalProcessor.onComplete(), terminalProcessor::onError); } }).mergeWith(terminalProcessor); }); return messageStream .map(message -> readMessage(channelSerializer.getReader(), messageSerializer.getReader(), message)); }
private <C, B> Flux<Message<C, B>> doReceive(SerializationPair<C> channelSerializer, SerializationPair<B> messageSerializer, Mono<ReactiveSubscription> subscription, ByteBuffer[] patterns, ByteBuffer[] channels) { Flux<Message<ByteBuffer, ByteBuffer>> messageStream = subscription.flatMapMany(it -> { Mono<Void> subscribe = subscribe(patterns, channels, it); MonoProcessor<ChannelMessage<ByteBuffer, ByteBuffer>> terminalProcessor = MonoProcessor.create(); return it.receive().mergeWith(subscribe.then(Mono.defer(() -> { getSubscribers(it).registered(); return Mono.empty(); }))).doOnCancel(() -> { Subscribers subscribers = getSubscribers(it); if (subscribers.unregister()) { subscriptions.remove(it); it.unsubscribe().subscribe(v -> terminalProcessor.onComplete(), terminalProcessor::onError); } }).mergeWith(terminalProcessor); }); return messageStream .map(message -> readMessage(channelSerializer.getReader(), messageSerializer.getReader(), message)); }