@Test public void nonSerializedSinkMultiProducer() throws Exception { TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .build(); FluxSink<Integer> sink = processor.sink(); assertThat(sink).isNotInstanceOf(SerializedSink.class); assertThat(sink.next(1)).isNotInstanceOf(SerializedSink.class); }
@Test public void serializedSinkSingleProducer() throws Exception { TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(false) .build(); FluxSink<Integer> sink = processor.sink(); assertThat(sink).isInstanceOf(SerializedSink.class); sink = sink.next(1); assertThat(sink).isInstanceOf(SerializedSink.class); sink = sink.onRequest(n -> {}); assertThat(sink).isInstanceOf(SerializedSink.class); }
@Test(timeout = 5_000) public void testBufferSize1Created() throws Exception { TopicProcessor<String> broadcast = TopicProcessor.<String>builder().name("share-name").bufferSize(1).autoCancel(true).build(); int simultaneousSubscribers = 3000; CountDownLatch latch = new CountDownLatch(simultaneousSubscribers); Scheduler scheduler = Schedulers.single(); FluxSink<String> sink = broadcast.sink(); Flux<String> flux = broadcast.filter(Objects::nonNull) .publishOn(scheduler) .cache(1); for (int i = 0; i < simultaneousSubscribers; i++) { flux.subscribe(s -> latch.countDown()); } sink.next("data"); assertThat(latch.await(4, TimeUnit.SECONDS)) .overridingErrorMessage("Data not received") .isTrue(); }
@Test(timeout = 5_000) public void testBufferSize1Shared() throws Exception { TopicProcessor<String> broadcast = TopicProcessor.<String>builder() .name("share-name") .bufferSize(1) .autoCancel(true) .share(true) .build(); int simultaneousSubscribers = 3000; CountDownLatch latch = new CountDownLatch(simultaneousSubscribers); Scheduler scheduler = Schedulers.single(); FluxSink<String> sink = broadcast.sink(); Flux<String> flux = broadcast.filter(Objects::nonNull) .publishOn(scheduler) .cache(1); for (int i = 0; i < simultaneousSubscribers; i++) { flux.subscribe(s -> latch.countDown()); } sink.next("data"); assertThat(latch.await(4, TimeUnit.SECONDS)) .overridingErrorMessage("Data not received") .isTrue(); }
@Test public void serializedSinkMultiProducerWithOnRequest() throws Exception { TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .build(); FluxSink<Integer> sink = processor.sink(); FluxSink<Integer> serializedSink = sink.onRequest(n -> { FluxSink<Integer> s = sink.next(1); assertThat(s).isInstanceOf(SerializedSink.class); s.next(2); }); assertThat(serializedSink).isInstanceOf(SerializedSink.class); StepVerifier.create(processor) .thenRequest(5) .expectNext(1, 2) .thenCancel() .verify(); } }