2014-09-29 42 views
0

試圖使用Undertow。 這裏簡單的例子:Undertow多處理程序調用

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()"); 
    } 
} 
} 

它的工作原理。我輸入

http://localhost:3333/ 

在瀏覽器和處理程序中創建查詢到Postgres並接收答案。 但是,處理程序重複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

我使用PathHandler將「/」&「/ something」路由到不同的HttpHandler實例。現在,我得到了以下代碼的類似結果。 'listeow.foListenerInfo()。forEach(listenerInfo - > logger.info(「Try {}:/ {}」,listenerInfo.getProtcol(),listenerInfo.getAddress()));'。我得到了兩次打印的響應,例如「Try http://127.0.0.1:8080」。似乎有關。 – dexter2305 2017-07-25 14:21:41

回答

0

我建議打印出(或註銷)交換參數,以查看正在處理的請求類型。

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

一種選擇是,所述第二請求是用於/favicon.ico。您也可以嘗試以更受控制的方式提出請求 - 即。使用其中一個REST客戶端甚至捲曲。