Response.finishError

This commit is contained in:
redkale
2023-10-18 15:29:56 +08:00
parent d743d7e90d
commit 8cba160af8
4 changed files with 47 additions and 26 deletions

View File

@@ -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);
} }

View File

@@ -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) {

View File

@@ -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状态码输出
*/ */

View File

@@ -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);
} }