From de7c5e84f4bf048cfc429ea20a577c72883db579 Mon Sep 17 00:00:00 2001 From: redkale Date: Mon, 8 May 2023 08:25:36 +0800 Subject: [PATCH] =?UTF-8?q?Response=E5=A2=9E=E5=8A=A0afterFinishListeners?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/redkale/net/Response.java | 26 ++++++++++++++++--- .../org/redkale/net/http/HttpResponse.java | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/redkale/net/Response.java b/src/main/java/org/redkale/net/Response.java index f6731a80a..dc9f50dad 100644 --- a/src/main/java/org/redkale/net/Response.java +++ b/src/main/java/org/redkale/net/Response.java @@ -8,6 +8,7 @@ package org.redkale.net; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; +import java.util.*; import java.util.concurrent.*; import java.util.function.*; import java.util.logging.Level; @@ -48,13 +49,15 @@ public abstract class Response> { protected BiConsumer> recycleListener; + protected List afterFinishListeners; + protected Filter> filter; protected Servlet> servlet; private final ByteBuffer writeBuffer; - protected final CompletionHandler finishBytesIOThreadHandler = new CompletionHandler() { + private final CompletionHandler finishBytesIOThreadHandler = new CompletionHandler() { @Override public void completed(Integer result, Void attachment) { @@ -68,7 +71,7 @@ public abstract class Response> { }; - protected final CompletionHandler finishBufferIOThreadHandler = new CompletionHandler() { + private final CompletionHandler finishBufferIOThreadHandler = new CompletionHandler() { @Override public void completed(Integer result, ByteBuffer attachment) { @@ -239,6 +242,13 @@ public abstract class Response> { this.recycleListener = recycleListener; } + public void addAfterFinishListener(Runnable listener) { + if (this.afterFinishListeners == null) { + this.afterFinishListeners = new ArrayList<>(); + } + this.afterFinishListeners.add(listener); + } + public Object getOutput() { return output; } @@ -266,6 +276,10 @@ public abstract class Response> { completeInIOThread(true); } + protected void completeFinishBytes(Integer result, Void attachment) { + completeInIOThread(); + } + private void completeInIOThread(boolean kill) { if (!this.inited) { return; //避免重复关闭 @@ -274,10 +288,16 @@ public abstract class Response> { if (kill) { refuseAlive(); } + if (this.afterFinishListeners != null) { + for (Runnable listener : this.afterFinishListeners) { + listener.run(); + } + this.afterFinishListeners = null; + } if (this.recycleListener != null) { try { this.recycleListener.accept(request, this); - } catch (Exception e) { + } catch (Throwable e) { context.logger.log(Level.WARNING, "Response.recycleListener error, request = " + request, e); } this.recycleListener = null; diff --git a/src/main/java/org/redkale/net/http/HttpResponse.java b/src/main/java/org/redkale/net/http/HttpResponse.java index 363d5c6a7..3bc5ae6d7 100644 --- a/src/main/java/org/redkale/net/http/HttpResponse.java +++ b/src/main/java/org/redkale/net/http/HttpResponse.java @@ -1360,7 +1360,7 @@ public class HttpResponse extends Response { fileChannel.close(); } catch (IOException ie) { } - finishBytesIOThreadHandler.completed(result, attachment); + completeFinishBytes(result, attachment); return; } if (fileChannel == null) {