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