From 0605c0f3be7740be7147faadfb7df080632c1981 Mon Sep 17 00:00:00 2001 From: Violeta Georgieva Date: Wed, 29 Jun 2016 10:23:38 +0300 Subject: [PATCH] Make AbstractResponseBodySubscriber.onSubscribe thread-safe When there are simultaneous invocations of onSubscribe, only the first one should succeed, the rest should cancel the provided subscriptions --- .../reactive/AbstractResponseBodySubscriber.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java index 98d13c52e2..8158d525f7 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java @@ -18,6 +18,7 @@ package org.springframework.http.server.reactive; import java.io.IOException; import java.nio.channels.Channel; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import javax.servlet.WriteListener; @@ -169,11 +170,13 @@ abstract class AbstractResponseBodySubscriber implements Subscriber @Override void onSubscribe(AbstractResponseBodySubscriber subscriber, Subscription subscription) { - if (BackpressureUtils.validate(subscriber.subscription, subscription)) { + Objects.requireNonNull(subscription, "Subscription cannot be null"); + if (subscriber.changeState(this, REQUESTED)) { subscriber.subscription = subscription; - if (subscriber.changeState(this, REQUESTED)) { - subscription.request(1); - } + subscription.request(1); + } + else { + super.onSubscribe(subscriber, subscription); } } }, -- GitLab