2014-09-29 4 views
0

언더 토우를 사용하려고합니다. 여기 간단한 예 :언더 토우 다중 처리기 호출

public class MyExample { 

private static int SIMPLE_HANDLER_CALL = 0; 
private static int LIBRE_OFFICE_CALL = 0; 

public static void main(String[] args) { 

    Undertow server = Undertow.builder() 
      .addHttpListener(3333, "localhost") 
      .setHandler(new SimpleHttpHandler()) 
      .build(); 

    server.start(); 
} 

private static class SimpleHttpHandler implements HttpHandler{ 
    @Override 
    public void handleRequest(HttpServerExchange exchange) throws Exception { 
     System.out.println("---------------------------------------------"); 
     System.out.println("start handleRequest()"); 
     exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); 
     connectToPg(exchange, "msgPrev = " + Integer.toString(SIMPLE_HANDLER_CALL) + "; msgCur = " + Integer.toString(++SIMPLE_HANDLER_CALL)); 
     System.out.println("end handleRequest()"); 
    } 
} 

private static void connectToPg(HttpServerExchange exchange, String msg){ 
    try(
      Connection connection = DriverManager.getConnection("jdbc:postgresql://10.10.2.158:5432/myDb", "myUser", "myPass"); 
      Statement st = connection.createStatement(); 
    ) 
    { 
     ResultSet rs = st.executeQuery("select count(*) as CNT from event.event"); 

     java.util.Date now = new java.util.Date(); 
     while(rs.next()){ 
      int cnt = rs.getInt("CNT"); 
      System.out.print("cnt = " + cnt); 
      exchange.getResponseSender().send("Date = " + now + "; cnt = " + cnt); 
     } 

     System.out.println("rs = " + rs.toString()); 
     System.out.println("msg = " + msg); 
    } 
    catch (Exception ex){ 
     System.out.println(ex.getMessage()); 
    } 
    finally { 
     System.out.println("end connectToPg()"); 
    } 
} 
} 

작동합니다. 브라우저에 브라우저를 입력하고 처리기에서 creategreate를 실행하여 답변을 받으려면

http://localhost:3333/ 

을 입력하십시오. 그러나 핸들러는 2 번 반복됩니다! 콘솔에서 이러한 결과를 얻었습니다.

--------------------------------------------- 
start handleRequest() 
cnt = 12rs = [email protected] 
msg = msgPrev = 0; msgCur = 1 
end connectToPg() 
end handleRequest() 
--------------------------------------------- 
start handleRequest() 
cnt = 12rs = [email protected] 
msg = msgPrev = 1; msgCur = 2 
end connectToPg() 
end handleRequest() 

왜 2 번이라고 부르죠?

+0

"/"& "/ something"을 다른 HttpHandler 인스턴스로 라우팅하기 위해 PathHandler를 사용했습니다. 이제 다음 코드에 대해 비슷한 결과가 나타납니다. 'undertow.getListenerInfo(). forEach (listenerInfo -> logger.info ("시도 {} :/{}", listenerInfo.getProtcol(), listenerInfo.getAddress()))'. 나는 'Try http : //127.0.0.1 : 8080'과 같이 두 번 인쇄 된 응답을받습니다. 관련이있는 것 같습니다. – dexter2305

답변

0

교환 매개 변수를 출력 (또는 로그 아웃)하여 어떤 종류의 요청이 처리되는지 확인하는 것이 좋습니다.

System.out.println(exchange.getRequestURL());

하나의 옵션은 두 번째 요청이 /favicon.ico에 대한 것입니다. 또한보다 통제 된 방식으로 요청을 시도 할 수도 있습니다. REST 클라이언트 중 하나를 사용하거나 말리기도합니다.