代码之家  ›  专栏  ›  技术社区  ›  lionheart

WebSphere服务器和带有java.lang.illegalstateexception state==头的Jetty客户端

  •  0
  • lionheart  · 技术社区  · 13 年前

    我有两个包——一个是在传统的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网络问题吗? 我有更多的信息,但我认为这些信息应该足够了

    1 回复  |  直到 13 年前
        1
  •  0
  •   lionheart    13 年前

    好的,对谁来说可能是这样:

    我决定检查所有的WebSphere配置,并定义了一个具有TCP链接和一个新端口的虚拟主机。然后,我用一个新的ant构建重新编译了所有的包。

    之后(这是最重要的部分)-我用[CDATA]定义了配置文件中提到的url,并且不使用localhost。相反,我使用了服务器和客户端的主机名。

    维奥拉,一切似乎都正常。