AbstractListenerWriteProcessor/AbstractListenerWriteFlushProcessor error handling

When an exception happens while writing/flushing, the exception handling
for Servlet 3.1 based implementation will happen when
WriteListener#onError and AsyncListener#onError events are received
This commit is contained in:
Violeta Georgieva 2017-05-02 23:22:01 +03:00 committed by Rossen Stoyanchev
parent 23a052c160
commit e8d2c6c74b
4 changed files with 49 additions and 15 deletions

View File

@ -103,6 +103,14 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
}
}
/**
* Invoked when an error happens while flushing. Defaults to no-op.
* Servlet 3.1 based implementations will receive
* {@link AsyncListener#onError(Throwable)} event.
*/
protected void flushingFailed(Throwable t) {
}
/**
* Create a new processor for subscribing to the next flush boundary.
@ -167,8 +175,8 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo
processor.flush();
}
catch (IOException ex) {
processor.cancel();
processor.onError(ex);
processor.flushingFailed(ex);
return;
}
if (processor.subscriberCompleted) {
if (processor.changeState(this, COMPLETED)) {

View File

@ -162,6 +162,15 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T,
protected void writingComplete() {
}
/**
* Invoked when an error happens while writing. Defaults to no-op.
* Servlet 3.1 based implementations will receive
* {@link WriteListener#onError(Throwable)} event.
*/
protected void writingFailed(Throwable t) {
}
private boolean changeState(State oldState, State newState) {
return this.state.compareAndSet(oldState, newState);
@ -276,8 +285,7 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T,
}
}
catch (IOException ex) {
processor.cancel();
processor.onError(ex);
processor.writingFailed(ex);
}
}
}

View File

@ -196,9 +196,11 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
bodyFlushProcessor.cancel();
bodyFlushProcessor.onError(ex);
}
if (bodyProcessor != null) {
bodyProcessor.cancel();
bodyProcessor.onError(ex);
ResponseBodyProcessor processor = bodyProcessor;
if (processor != null) {
processor.cancel();
processor.onError(ex);
}
}
@ -208,9 +210,11 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
bodyFlushProcessor.cancel();
bodyFlushProcessor.onComplete();
}
if (bodyProcessor != null) {
bodyProcessor.cancel();
bodyProcessor.onComplete();
ResponseBodyProcessor processor = bodyProcessor;
if (processor != null) {
processor.cancel();
processor.onComplete();
}
}
}
@ -220,16 +224,18 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
@Override
public void onWritePossible() throws IOException {
if (bodyProcessor != null) {
bodyProcessor.onWritePossible();
ResponseBodyProcessor processor = bodyProcessor;
if (processor != null) {
processor.onWritePossible();
}
}
@Override
public void onError(Throwable ex) {
if (bodyProcessor != null) {
bodyProcessor.cancel();
bodyProcessor.onError(ex);
ResponseBodyProcessor processor = bodyProcessor;
if (processor != null) {
processor.cancel();
processor.onError(ex);
}
}
}

View File

@ -229,6 +229,12 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
this.channel.getWriteSetter().set(null);
this.channel.resumeWrites();
}
@Override
protected void writingFailed(Throwable t) {
cancel();
onError(t);
}
}
@ -248,6 +254,12 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
UndertowServerHttpResponse.this.responseChannel.flush();
}
}
@Override
protected void flushingFailed(Throwable t) {
cancel();
onError(t);
}
}
}