Browse Source

Ensure onComplete/onError events will be delivered

Issue: SPR-16207
pull/1598/merge
Violeta Georgieva 8 years ago committed by Rossen Stoyanchev
parent
commit
41b13a4e8a
  1. 10
      spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java
  2. 12
      spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java
  3. 34
      spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java
  4. 10
      spring-web/src/main/java/org/springframework/http/server/reactive/WriteResultPublisher.java

10
spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java

@ -312,7 +312,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> { @@ -312,7 +312,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> {
}
<T> void cancel(AbstractListenerReadPublisher<T> publisher) {
publisher.changeState(this, COMPLETED);
if (!publisher.changeState(this, COMPLETED)) {
publisher.state.get().cancel(publisher);
}
}
<T> void onDataAvailable(AbstractListenerReadPublisher<T> publisher) {
@ -325,6 +327,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> { @@ -325,6 +327,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> {
publisher.subscriber.onComplete();
}
}
else {
publisher.state.get().onAllDataRead(publisher);
}
}
<T> void onError(AbstractListenerReadPublisher<T> publisher, Throwable t) {
@ -333,6 +338,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> { @@ -333,6 +338,9 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> {
publisher.subscriber.onError(t);
}
}
else {
publisher.state.get().onError(publisher, t);
}
}
}

12
spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteFlushProcessor.java

@ -190,6 +190,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo @@ -190,6 +190,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
if (processor.changeState(this, COMPLETED)) {
processor.resultPublisher.publishComplete();
}
else {
processor.state.get().onComplete(processor);
}
}
},
@ -212,6 +215,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo @@ -212,6 +215,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
else if (processor.changeState(this, COMPLETED)) {
processor.resultPublisher.publishComplete();
}
else {
processor.state.get().onComplete(processor);
}
}
else {
if (processor.changeState(this, REQUESTED)) {
@ -238,6 +244,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo @@ -238,6 +244,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
if (processor.changeState(this, COMPLETED)) {
processor.resultPublisher.publishComplete();
}
else {
processor.state.get().onComplete(processor);
}
}
public <T> void onNext(AbstractListenerWriteFlushProcessor<T> processor, Publisher<? extends T> publisher) {
// ignore
@ -275,6 +284,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo @@ -275,6 +284,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
if (processor.changeState(this, COMPLETED)) {
processor.resultPublisher.publishError(ex);
}
else {
processor.state.get().onError(processor, ex);
}
}
public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) {

34
spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerWriteProcessor.java

@ -251,6 +251,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, @@ -251,6 +251,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T,
processor.writingComplete();
processor.resultPublisher.publishComplete();
}
else {
processor.state.get().onComplete(processor);
}
}
},
@ -274,15 +277,29 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, @@ -274,15 +277,29 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T,
if (writeCompleted) {
processor.releaseData();
if (!processor.subscriberCompleted) {
processor.changeState(WRITING, REQUESTED);
processor.suspendWriting();
Assert.state(processor.subscription != null, "No subscription");
processor.subscription.request(1);
if (processor.changeState(WRITING, REQUESTED)) {
if (processor.subscriberCompleted) {
if (processor.changeState(REQUESTED, COMPLETED)) {
processor.writingComplete();
processor.resultPublisher.publishComplete();
} else {
processor.state.get().onComplete(processor);
}
}
else {
processor.suspendWriting();
Assert.state(processor.subscription != null, "No subscription");
processor.subscription.request(1);
}
}
}
else {
processor.changeState(WRITING, COMPLETED);
processor.writingComplete();
processor.resultPublisher.publishComplete();
if (processor.changeState(WRITING, COMPLETED)) {
processor.writingComplete();
processor.resultPublisher.publishComplete();
} else {
processor.state.get().onComplete(processor);
}
}
}
else {
@ -343,6 +360,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, @@ -343,6 +360,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T,
processor.writingComplete();
processor.resultPublisher.publishError(ex);
}
else {
processor.state.get().onError(processor, ex);
}
}
public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) {

10
spring-web/src/main/java/org/springframework/http/server/reactive/WriteResultPublisher.java

@ -158,6 +158,9 @@ class WriteResultPublisher implements Publisher<Void> { @@ -158,6 +158,9 @@ class WriteResultPublisher implements Publisher<Void> {
Assert.state(publisher.subscriber != null, "No subscriber");
publisher.subscriber.onComplete();
}
else {
publisher.state.get().publishComplete(publisher);
}
}
@Override
void publishError(WriteResultPublisher publisher, Throwable t) {
@ -165,6 +168,9 @@ class WriteResultPublisher implements Publisher<Void> { @@ -165,6 +168,9 @@ class WriteResultPublisher implements Publisher<Void> {
Assert.state(publisher.subscriber != null, "No subscriber");
publisher.subscriber.onError(t);
}
else {
publisher.state.get().publishError(publisher, t);
}
}
},
@ -196,7 +202,9 @@ class WriteResultPublisher implements Publisher<Void> { @@ -196,7 +202,9 @@ class WriteResultPublisher implements Publisher<Void> {
}
void cancel(WriteResultPublisher publisher) {
publisher.changeState(this, COMPLETED);
if (!publisher.changeState(this, COMPLETED)) {
publisher.state.get().cancel(publisher);
}
}
void publishComplete(WriteResultPublisher publisher) {

Loading…
Cancel
Save