Response.finishError
This commit is contained in:
@@ -83,7 +83,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
decode(buffer, response, 0, null);
|
||||
} catch (Throwable t) { //此处不可 context.offerBuffer(buffer); 以免dispatcher.dispatch内部异常导致重复 offerBuffer
|
||||
context.logger.log(Level.WARNING, "dispatch servlet abort, force to close channel ", t);
|
||||
response.error(t);
|
||||
response.errorInIOCodec(t);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
decode(data, response, 0, null);
|
||||
} catch (Throwable t) {
|
||||
context.logger.log(Level.WARNING, "dispatch servlet abort, force to close channel ", t);
|
||||
response.error(t);
|
||||
response.errorInIOCodec(t);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -125,7 +125,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
decode(data, response, 0, null);
|
||||
} catch (Throwable t) {
|
||||
context.logger.log(Level.WARNING, "dispatch servlet abort, force to close channel ", t);
|
||||
response.error(t);
|
||||
response.errorInIOCodec(t);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -150,7 +150,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
if (rs != Integer.MIN_VALUE) {
|
||||
dispatcher.incrIllegalRequestCounter();
|
||||
}
|
||||
response.error(null);
|
||||
response.errorInIOCodec(null);
|
||||
if (context.logger.isLoggable(Level.FINEST)) {
|
||||
context.logger.log(Level.FINEST, "request.readHeader erroneous (" + rs + "), force to close channel ");
|
||||
}
|
||||
@@ -183,7 +183,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
decode(buffer, pipelineResponse, pindex + 1, hreq);
|
||||
} catch (Throwable t) { //此处不可 offerBuffer(buffer); 以免dispatcher.dispatch内部异常导致重复 offerBuffer
|
||||
context.logger.log(Level.WARNING, "dispatch pipeline servlet abort, force to close channel ", t);
|
||||
pipelineResponse.error(t);
|
||||
pipelineResponse.errorInIOCodec(t);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -225,7 +225,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
|
||||
public void failed(Throwable exc, ByteBuffer attachment) {
|
||||
context.dispatcher.incrIllegalRequestCounter();
|
||||
channel.offerReadBuffer(attachment);
|
||||
response.error(exc);
|
||||
response.errorInIOCodec(exc);
|
||||
if (exc != null) {
|
||||
request.context.logger.log(Level.FINER, "Servlet continue read channel erroneous, force to close channel ", exc);
|
||||
}
|
||||
|
||||
@@ -49,6 +49,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
|
||||
protected BiConsumer<R, Response<C, R>> recycleListener;
|
||||
|
||||
protected BiConsumer<R, Throwable> errorHandler;
|
||||
|
||||
protected List<Runnable> afterFinishListeners;
|
||||
|
||||
protected Filter<C, R, ? extends Response<C, R>> filter;
|
||||
@@ -61,7 +63,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
|
||||
@Override
|
||||
public void completed(Integer result, Void attachment) {
|
||||
completeInIOThread();
|
||||
completeInIOThread(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -80,7 +82,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
} else {
|
||||
attachment.clear();
|
||||
}
|
||||
completeInIOThread();
|
||||
completeInIOThread(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,7 +106,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
channel.offerWriteBuffer(attachment);
|
||||
}
|
||||
}
|
||||
completeInIOThread();
|
||||
completeInIOThread(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -242,6 +244,10 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
this.recycleListener = recycleListener;
|
||||
}
|
||||
|
||||
public void errorHandler(BiConsumer<R, Throwable> errorHandler) {
|
||||
this.errorHandler = errorHandler;
|
||||
}
|
||||
|
||||
public void addAfterFinishListener(Runnable listener) {
|
||||
if (this.afterFinishListeners == null) {
|
||||
this.afterFinishListeners = new ArrayList<>();
|
||||
@@ -262,22 +268,43 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
||||
return !this.inited;
|
||||
}
|
||||
|
||||
private void completeInIOThread() {
|
||||
this.completeInIOThread(false);
|
||||
/**
|
||||
* Servlet.execute执行时报错
|
||||
*
|
||||
* 被重载后kill不一定为true
|
||||
*
|
||||
* @param t Throwable
|
||||
*/
|
||||
public final void finishError(Throwable t) {
|
||||
BiConsumer<R, Throwable> handler = this.errorHandler;
|
||||
if (handler != null) {
|
||||
this.errorHandler = null;
|
||||
try {
|
||||
handler.accept(request, t);
|
||||
} catch (Throwable e) {
|
||||
context.logger.log(Level.WARNING, "Response.errorHandler error, request = " + request, e);
|
||||
defaultError(t);
|
||||
}
|
||||
} else {
|
||||
defaultError(t);
|
||||
}
|
||||
}
|
||||
|
||||
//被重载后kill不一定为true
|
||||
protected void finishError(Throwable t) {
|
||||
error(t);
|
||||
protected void defaultError(Throwable t) {
|
||||
errorInIOCodec(t);
|
||||
}
|
||||
|
||||
//kill=true
|
||||
protected void error(Throwable t) {
|
||||
/**
|
||||
* 对请求包进行编解码时报错, 非Servlet.execute执行报错
|
||||
*
|
||||
* @param t Throwable
|
||||
*/
|
||||
protected void errorInIOCodec(Throwable t) {
|
||||
completeInIOThread(true);
|
||||
}
|
||||
|
||||
protected void completeFinishBytes(Integer result, Void attachment) {
|
||||
completeInIOThread();
|
||||
completeInIOThread(false);
|
||||
}
|
||||
|
||||
private void completeInIOThread(boolean kill) {
|
||||
|
||||
@@ -21,9 +21,9 @@ import org.redkale.convert.*;
|
||||
import org.redkale.convert.json.*;
|
||||
import org.redkale.net.*;
|
||||
import org.redkale.service.RetResult;
|
||||
import org.redkale.util.*;
|
||||
import org.redkale.util.AnyValue.DefaultAnyValue;
|
||||
import org.redkale.util.AnyValue.Entry;
|
||||
import org.redkale.util.*;
|
||||
import static org.redkale.util.Utility.append;
|
||||
|
||||
/**
|
||||
@@ -329,7 +329,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finishError(Throwable t) {
|
||||
protected void defaultError(Throwable t) {
|
||||
finish(500, null);
|
||||
}
|
||||
|
||||
@@ -944,12 +944,6 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
super.finish(false, data.content(), 0, data.length());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void error(Throwable t) {
|
||||
refuseAlive();
|
||||
finish500();
|
||||
}
|
||||
|
||||
/**
|
||||
* 以304状态码输出
|
||||
*/
|
||||
|
||||
@@ -129,7 +129,7 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finishError(Throwable t) {
|
||||
protected void defaultError(Throwable t) {
|
||||
finish(RETCODE_THROWEXCEPTION, null);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user