2014-09-29 3 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()"); 
    } 
} 
} 

Он работает. I введите

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. Теперь я получаю аналогичный результат для следующего кода. 'perow.getListenerInfo(). forEach (listenerInfo -> logger.info (" Try {}:/{} ", listenerInfo.getProtcol(), listenerInfo.getAddress()));'. Я получаю ответ, напечатанный дважды, как 'Try http: //127.0.0.1: 8080'. Кажется, связано. – dexter2305

ответ

0

Я предлагаю распечатать (или выйти из системы) обменять параметры, чтобы посмотреть, какой запрос обрабатывается.

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

Одним из вариантов является то, что второй запрос для /favicon.ico. Вы также можете попытаться сделать запрос более контролируемым образом - т.е. используя один из клиентов REST или даже завиток.

Смежные вопросы