我想用模板方法(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] Socket: [org.apache.tomcat.util.net.NioEndpoint$KeyAttachment@6bc6f271:org.apache.tomcat.util.net.NioChannel@2072289:java.nio.channels.SocketChannel中[连接 local = / 0:0:0:0:0:0:0:1:8080 remote = / 0:0:0:0:0:0:0:1:57585]],状态 in:[OPEN_READ],陈述:[已关闭]
2016-01-31 19:13:52 LimitLatch [DEBUG]计数 down [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();
}
}
}
问题出在哪里?
最好的问候。
答案 0 :(得分:0)
好的,我发现了问题。我发送了大约有100 MB内容的http帖子,但我只阅读了第一个1024 B的消息,因为业务需求(以及规范,我能够在消息的开头找到有趣的信息)。我可以看到,Tomcat不允许我在1024B之后中断输入流并立即发送响应。
所以,我的最后一个问题是:
是否可以做类似的事情(只读信息的一部分)?还是反对TCP标准?