Response增加afterFinishListeners

This commit is contained in:
redkale
2023-05-08 08:25:36 +08:00
parent 18932bf48b
commit de7c5e84f4
2 changed files with 24 additions and 4 deletions

View File

@@ -8,6 +8,7 @@ package org.redkale.net;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.CompletionHandler; import java.nio.channels.CompletionHandler;
import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.function.*; import java.util.function.*;
import java.util.logging.Level; import java.util.logging.Level;
@@ -48,13 +49,15 @@ 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 List<Runnable> afterFinishListeners;
protected Filter<C, R, ? extends Response<C, R>> filter; protected Filter<C, R, ? extends Response<C, R>> filter;
protected Servlet<C, R, ? extends Response<C, R>> servlet; protected Servlet<C, R, ? extends Response<C, R>> servlet;
private final ByteBuffer writeBuffer; private final ByteBuffer writeBuffer;
protected final CompletionHandler finishBytesIOThreadHandler = new CompletionHandler<Integer, Void>() { private final CompletionHandler finishBytesIOThreadHandler = new CompletionHandler<Integer, Void>() {
@Override @Override
public void completed(Integer result, Void attachment) { public void completed(Integer result, Void attachment) {
@@ -68,7 +71,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
}; };
protected final CompletionHandler finishBufferIOThreadHandler = new CompletionHandler<Integer, ByteBuffer>() { private final CompletionHandler finishBufferIOThreadHandler = new CompletionHandler<Integer, ByteBuffer>() {
@Override @Override
public void completed(Integer result, ByteBuffer attachment) { public void completed(Integer result, ByteBuffer attachment) {
@@ -239,6 +242,13 @@ public abstract class Response<C extends Context, R extends Request<C>> {
this.recycleListener = recycleListener; this.recycleListener = recycleListener;
} }
public void addAfterFinishListener(Runnable listener) {
if (this.afterFinishListeners == null) {
this.afterFinishListeners = new ArrayList<>();
}
this.afterFinishListeners.add(listener);
}
public Object getOutput() { public Object getOutput() {
return output; return output;
} }
@@ -266,6 +276,10 @@ public abstract class Response<C extends Context, R extends Request<C>> {
completeInIOThread(true); completeInIOThread(true);
} }
protected void completeFinishBytes(Integer result, Void attachment) {
completeInIOThread();
}
private void completeInIOThread(boolean kill) { private void completeInIOThread(boolean kill) {
if (!this.inited) { if (!this.inited) {
return; //避免重复关闭 return; //避免重复关闭
@@ -274,10 +288,16 @@ public abstract class Response<C extends Context, R extends Request<C>> {
if (kill) { if (kill) {
refuseAlive(); refuseAlive();
} }
if (this.afterFinishListeners != null) {
for (Runnable listener : this.afterFinishListeners) {
listener.run();
}
this.afterFinishListeners = null;
}
if (this.recycleListener != null) { if (this.recycleListener != null) {
try { try {
this.recycleListener.accept(request, this); this.recycleListener.accept(request, this);
} catch (Exception e) { } catch (Throwable e) {
context.logger.log(Level.WARNING, "Response.recycleListener error, request = " + request, e); context.logger.log(Level.WARNING, "Response.recycleListener error, request = " + request, e);
} }
this.recycleListener = null; this.recycleListener = null;

View File

@@ -1360,7 +1360,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
fileChannel.close(); fileChannel.close();
} catch (IOException ie) { } catch (IOException ie) {
} }
finishBytesIOThreadHandler.completed(result, attachment); completeFinishBytes(result, attachment);
return; return;
} }
if (fileChannel == null) { if (fileChannel == null) {