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:
committed by
Gary Russell
parent
e714310dae
commit
c94eaf7b52
@@ -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) ->
|
||||
|
||||
Reference in New Issue
Block a user