@Override public Flux<DataBuffer> encode(Publisher<? extends DataBuffer> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { Flux<DataBuffer> flux = Flux.from(inputStream); if (logger.isDebugEnabled() && !Hints.isLoggingSuppressed(hints)) { flux = flux.doOnNext(buffer -> { String logPrefix = Hints.getLogPrefix(hints); logger.debug(logPrefix + "Writing " + buffer.readableByteCount() + " bytes"); }); } return flux; }
@Override public Flux<WebSocketMessage> receive() { return getDelegate().getInbound() .aggregateFrames(this.maxFramePayloadLength) .receiveFrames() .map(super::toMessage) .doOnNext(message -> { if (logger.isTraceEnabled()) { logger.trace(getLogPrefix() + "Received " + message); } }); }
@PostMapping("/flux") public Mono<Void> createWithFlux(@RequestBody Flux<Person> flux) { return flux.doOnNext(persons::add).then(); }
@Override public Flux<DataBuffer> encode(Publisher<? extends DataBuffer> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) { Flux<DataBuffer> flux = Flux.from(inputStream); if (logger.isDebugEnabled() && !Hints.isLoggingSuppressed(hints)) { flux = flux.doOnNext(buffer -> { String logPrefix = Hints.getLogPrefix(hints); logger.debug(logPrefix + "Writing " + buffer.readableByteCount() + " bytes"); }); } return flux; }
@Override public Mono<Void> send(Publisher<WebSocketMessage> messages) { Flux<WebSocketFrame> frames = Flux.from(messages) .doOnNext(message -> { if (logger.isTraceEnabled()) { logger.trace(getLogPrefix() + "Sending " + message); } }) .map(this::toFrame); return getDelegate().getOutbound() .options(NettyPipeline.SendOptions::flushOnEach) .sendObject(frames) .then(); }
@PostMapping("/publisher") public Publisher<Void> createWithPublisher(@RequestBody Publisher<Person> publisher) { return Flux.from(publisher).doOnNext(persons::add).then(); }
@Override public Mono<Void> handle(WebSocketSession session) { // Use retain() for Reactor Netty return session.send(session.receive().doOnNext(WebSocketMessage::retain)); } }
public WiretapRecorder(@Nullable Publisher<? extends DataBuffer> publisher, @Nullable Publisher<? extends Publisher<? extends DataBuffer>> publisherNested) { if (publisher != null && publisherNested != null) { throw new IllegalArgumentException("At most one publisher expected"); } this.publisher = publisher != null ? Flux.from(publisher) .doOnSubscribe(s -> this.hasContentConsumer = true) .doOnNext(this.buffer::write) .doOnError(this::handleOnError) .doOnCancel(this::handleOnComplete) .doOnComplete(this::handleOnComplete) : null; this.publisherNested = publisherNested != null ? Flux.from(publisherNested) .doOnSubscribe(s -> this.hasContentConsumer = true) .map(p -> Flux.from(p).doOnNext(this.buffer::write).doOnError(this::handleOnError)) .doOnError(this::handleOnError) .doOnCancel(this::handleOnComplete) .doOnComplete(this::handleOnComplete) : null; if (publisher == null && publisherNested == null) { this.content.onComplete(); } }
@Override protected List<Scenario<String, String>> scenarios_touchAndAssertState() { return Arrays.asList(scenario(f -> f.doOnNext(d -> { }))); }
@Test public void sessionClosing() throws Exception { this.client.execute(getUrl("/close"), session -> { logger.debug("Starting.."); return session.receive() .doOnNext(s -> logger.debug("inbound " + s)) .then() .doFinally(signalType -> { logger.debug("Completed with: " + signalType); }); }) .block(TIMEOUT); }
void simpleFlux(){ Flux.just(1) .map(d -> d + 1) .doOnNext(d -> {throw new RuntimeException("test");}) .collectList() .onErrorReturn(Collections.singletonList(2)) .block(); }
@Override public Flux<Part> read(ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) { return Flux.create(new SynchronossPartGenerator(message, this.bufferFactory, this.streamStorageFactory)) .doOnNext(part -> { if (!Hints.isLoggingSuppressed(hints)) { LogFormatUtils.traceDebug(logger, traceOn -> Hints.getLogPrefix(hints) + "Parsed " + (isEnableLoggingRequestDetails() ? LogFormatUtils.formatValue(part, !traceOn) : "parts '" + part.name() + "' (content masked)")); } }); }
@Override public Flux<Part> read(ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) { return Flux.create(new SynchronossPartGenerator(message, this.bufferFactory, this.streamStorageFactory)) .doOnNext(part -> { if (!Hints.isLoggingSuppressed(hints)) { LogFormatUtils.traceDebug(logger, traceOn -> Hints.getLogPrefix(hints) + "Parsed " + (isEnableLoggingRequestDetails() ? LogFormatUtils.formatValue(part, !traceOn) : "parts '" + part.name() + "' (content masked)")); } }); }
@Test public void filterAllOut() { final int[] calls = { 0 }; StepVerifier.create( Flux.range(1, 1000) .doOnNext(v -> calls[0]++) .filterWhen(v -> Mono.just(false), 16) .flatMap(ignore -> Flux.just(0))) .verifyComplete(); assertThat(calls[0]).isEqualTo(1000); }
@Test public void filterAllOutHidden() { final int[] calls = { 0 }; StepVerifier.create( Flux.range(1, 1000) .doOnNext(v -> calls[0]++) .filterWhen(v -> Mono.just(false).hide(), 16) .flatMap(ignore -> Flux.just(0))) .verifyComplete(); assertThat(calls[0]).isEqualTo(1000); } }
@Test public void discardOnTimerRejected() { Scheduler scheduler = Schedulers.newSingle("discardOnTimerRejected"); StepVerifier.create(Flux.just(1, 2, 3) .doOnNext(n -> scheduler.dispose()) .bufferTimeout(10, Duration.ofMillis(100), scheduler)) .expectErrorSatisfies(e -> assertThat(e).isInstanceOf(RejectedExecutionException.class)) .verifyThenAssertThat() .hasDiscardedExactly(1); }
@Test public void syncFusionAvailable() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); Flux.range(1, 2) .doOnNext(v -> { }) .subscribe(ts); Subscription s = ts.upstream(); Assert.assertTrue("Non-fuseable upstream: " + s, s instanceof Fuseable.QueueSubscription); }
@Test public void syncFusionAvailable() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); Flux.range(1, 2) .doOnNext(v -> { }) .subscribe(ts); Subscription s = ts.upstream(); Assert.assertTrue("Non-fuseable upstream: " + s, s instanceof Fuseable.QueueSubscription); }
@Test public void callableReturnsNullFused2() { StepVerifier.create(Mono.fromCallable(() -> null) .flux() .subscribeOn(Schedulers.single()) .doOnNext(v -> System.out.println(v)), 1) .expectFusion(Fuseable.ASYNC) .thenRequest(1) .verifyComplete(); }
@Test public void publishOnFilter() throws Exception { Flux<Long> flux = Flux.interval(Duration.ofMillis(2)).take(255) .publishOn(scheduler) .filter(t -> true) .doOnNext(i -> onNext(i)) .doOnError(e -> onError(e)); verifyRejectedExecutionConsistency(flux, 5); }