【发布时间】:2025-12-21 15:20:22
【问题描述】:
我想创建两个带有模板方法 (GOF) 变体的 HttpServlet。所以我创建了从 HttpServlet 扩展的抽象类:
abstract public class AbstractServlet extends HttpServlet {
abstract void doSomeAction();
@Override
protected void service(HttpServletRequest rq, HttpServletResponse rs){
try {
//here some logging, getting headers etc.
System.out.println("Nothing really matters");
//invoke concrete class
doSomeAction();
//write response
rs.getOutputStream().write(new String("Simple response from class " + this.getClass().getCanonicalName()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
还有两个具体的类:
public class A extends AbstractServlet {
@Override
void doSomeAction() {
System.out.println("I'm doing something in A");
}
}
public class B extends AbstractServlet {
@Override
void doSomeAction() {
System.out.println("I'm doing something in B");
}
}
在调用(成功)其中一项服务后,我无法得到任何响应。经过一些调试,Tomcat的NIO通道和闩锁似乎有问题:
2016-01-31 19:13:52 Http11NioProtocol [DEBUG] 套接字: [org.apache.tomcat.util.net.NioEndpoint$KeyAttachment@6bc6f271:org.apache.tomcat.util.net.NioChannel@2072289:java.nio.channels.SocketChannel[已连接 本地=/0:0:0:0:0:0:0:1:8080 远程=/0:0:0:0:0:0:0:1:57585]],状态 输入:[OPEN_READ],声明输出:[CLOSED]
2016-01-31 19:13:52 LimitLatch [DEBUG] 计数 向下[http-nio-8080-exec-2] latch=1
但老实说,我不知道发生了什么。有趣的是,当 servlet 通过例如 IOUtils.toByteArray(InputStream is) 消耗所有 servletrequest 输入流时,一切正常!
abstract public class AbstractServlet extends HttpServlet {
abstract void doSomeAction();
@Override
protected void service(HttpServletRequest rq, HttpServletResponse rs){
try {
//here some logging, getting headers etc.
//Consume all inputStream
org.apache.commons.io.IOUtils.toByteArray(rq.getInputStream());
//invoke concrete class
doSomeAction();
//write response
rs.getOutputStream().write(new String("Simple response from class " + this.getClass().getCanonicalName()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题出在哪里?
最好的问候。
【问题讨论】:
标签: java tomcat servlets design-patterns nio