2013-04-12 1 views
0

기존의 웹 서버 (Tomcat 6, Websphere 7)에서 유지 관리 할 서버 1 개와 실행중인 웹 서버 인 Jetty에서 1 개를 유지하는 서버 2 개가 있습니다. 클라이언트로 작동합니다. 서버와 에이전트는 Windows 7 시스템과 JRE 6에서 완벽하게 로컬로 작동합니다. (1) 서버가 Tomcat에로드되었습니다. (2) 에이전트는 사용자 지정 포트가있는 Jetty 8 웹 서버를 초기화합니다.java.lang.illegalstateexception 상태 == 헤더가있는 WebSphere 서버 및 Jetty 클라이언트

Linux 환경에서 제작할 때 WAR를 WebSphere에로드 했으므로 정상적으로 작동합니다. 나는 'jave-jar'를 사용하여 Agent Jar을 프로덕션 환경에서 실행했습니다. 그들은 comunicate 후 - java.lang.illegalstateexception : state == header '예외에 실패하면 에이전트와 함께 실패합니다.

이제 로컬 컴퓨터로 WebSphere 프로덕션 응용 프로그램을 참조하고 모든 통신이 제대로 작동합니다 (Windows 7의 로컬 에이전트, Linux의 원격 서버).

그래서, 그것은 (또는 내부 부두로) 에이전트에 문제가있는 것 같다, 코드는 다음과 같이 진행됩니다

  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는 부두 처리 클래스입니다.

내가 조사했을 때 getReader()와 getInputStream()이 Jetty에서 문제가 있음을 알았지 만 합리적인 이유를 찾지 못했습니다. Windows 7에서는 Agent가 올바르게 작동하고 리눅스에는 문제가있다 (나는 여러 리눅스 서버를 사용했다).

Jetty WebServer의 특정 Linux 네트워크 문제에 대해 알고 있습니까? 내가 더 많은 정보를 가지고,하지만 난이 정보가 충분히

답변

0

확인을해야한다고 생각, 누구에 게 우려를 수

나는 모든 WebSphere 구성을 통해 가기로 결정 - 나는 TCP 체인과 가상 호스트를 정의 새로운 항구. 그런 다음 모든 패키지를 새로운 ant 빌드로 다시 컴파일했습니다.

이후 (가장 중요한 부분) - 구성 파일에서 언급 한 URL을 [CDATA]로 정의하고 localhost를 사용하지 마십시오. 대신 서버와 클라이언트의 호스트 이름을 사용했습니다.

비올라, 모든 것이 작동하는 것처럼 보입니다.