Fix IntegrationReactiveUtils

The `Mono.doOnSuccess()` is always called for completed `MonoSink`
even if the value is `null`

* Fix `IntegrationReactiveUtils.messageSourceToFlux()` to check a
message for `null` before calling `AckUtils.autoAck()`
* Add an `logger.error()` message when `doOnError()` is invoked for that `Mono`

**Cherry-pick to 5.3.x**
This commit is contained in:
Artem Bilan
2020-09-23 15:33:17 -04:00
committed by Gary Russell
parent e714310dae
commit c94eaf7b52

View File

@@ -19,6 +19,8 @@ package org.springframework.integration.util;
import java.time.Duration;
import java.util.concurrent.locks.LockSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.reactivestreams.Publisher;
import org.springframework.integration.StaticMessageHeaderAccessor;
@@ -45,6 +47,8 @@ import reactor.core.scheduler.Schedulers;
*/
public final class IntegrationReactiveUtils {
private static final Log logger = LogFactory.getLog(IntegrationReactiveUtils.class);
/**
* The subscriber context entry for {@link Flux#delayElements}
* from the {@link Mono#repeatWhenEmpty(java.util.function.Function)}.
@@ -76,14 +80,18 @@ public final class IntegrationReactiveUtils {
return Mono.
<Message<T>>create(monoSink ->
monoSink.onRequest(value -> monoSink.success(messageSource.receive())))
.doOnSuccess((message) ->
AckUtils.autoAck(StaticMessageHeaderAccessor.getAcknowledgmentCallback(message)))
.doOnSuccess((message) -> {
if (message != null) {
AckUtils.autoAck(StaticMessageHeaderAccessor.getAcknowledgmentCallback(message));
}
})
.doOnError(MessagingException.class,
(ex) -> {
Message<?> failedMessage = ex.getFailedMessage();
if (failedMessage != null) {
AckUtils.autoNack(StaticMessageHeaderAccessor.getAcknowledgmentCallback(failedMessage));
}
logger.error("Error from Flux for : " + messageSource, ex);
})
.subscribeOn(Schedulers.boundedElastic())
.repeatWhenEmpty((repeat) ->