我有两个包——一个是在传统的Web服务器(Tomcat6,Websphere 7)中维护的服务器,另一个是作为客户端运行的动态Web服务器Jetty。
服务器和代理在Windows 7计算机和JRE 6上可以完美地在本地工作:
(1) 服务器已加载到Tomcat。
(2) 代理使用自定义端口初始化Jetty 8 web服务器。
当我把它放在生产Linux环境中时,我把WAR加载到了WebSphere,它似乎工作得很好。我在生产中使用“jave-jar”执行了Agent jar,它似乎可以工作。在它们通信之后-如果在“java.lang.illegalstateexception:state==header”异常上失败,则与Agent一起失败。
现在,我将WebSphere生产应用程序引用到我的本地机器上,所有的通信都正常工作(代理在Windows 7上本地运行,服务器在Linux上远程运行)。
因此,代理(或其内部Jetty)似乎有问题,代码如下:
private void respondOK(Request baseRequest, HttpServletResponse response)
throws IOException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("OK");
}
private boolean handleAgentMonitoringTasks(
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response) {
boolean didRespond = false;
// extract the agent data
try {
String reqContent = readRequestContent(baseRequest);
// handle the input
theAgentWorker.updateTasksList(reqContent);
} catch (IOException e) {
// send a response indicating the error
respondError(baseRequest, response, "Error getting request content - " + e.getMessage(), e);
didRespond = true;
}
return didRespond;
}
private boolean handleServerInfo( Request baseRequest,
HttpServletRequest request,
HttpServletResponse response) {
boolean didRespond = false;
// extract the request content
try {
String reqContent = readRequestContent(baseRequest);
if (reqContent.length() > 0) {
try {
theAgentWorker.handleServerInfoData(reqContent);
}
catch (Exception e) {
respondError(baseRequest, response, "Error setting server information - " + e.getMessage(), e);
didRespond = true;
}
}
else {
respondError(baseRequest, response, "Server address not found in the request", null);
didRespond = true;
}
} catch (IOException e) {
// send a response indicating the error
respondError(baseRequest, response, "Error getting request content - " + e.getMessage(), e);
didRespond = true;
}
return didRespond;
}
private String readRequestContent(Request baseRequest) throws IOException {
BufferedReader br = baseRequest.getReader();
StringBuilder sBuilder = new StringBuilder();
char[] buff = new char[4092];
int charsRead = br.read(buff, 0, buff.length);
while (charsRead == buff.length) {
sBuilder.append(buff);
charsRead = br.read(buff, 0, buff.length);
}
sBuilder.append(buff,0, charsRead);
return sBuilder.toString();
}
以上所有代码都进入这个类:
公共类AgentHttpHandler扩展了AbstractHandler
AbstractHandler是Jetty的处理程序类。
当我研究它时,我发现Jetty的getReader()和getInputStream()存在问题,但我找不到一个合理的解释来解释它不稳定的原因——在Windows7中,Agent工作得很好,在Linux上也有问题(我试过几台Linux服务器)。
你知道Jetty WebServer的某些Linux网络问题吗?
我有更多的信息,但我认为这些信息应该足够了