0

Trying to use Undertow. Here simple example:

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

It works. I type

http://localhost:3333/

in browser and handler create query to Postgres and receive answer. But, handler repeats 2 times! I get such output in console:

---------------------------------------------
start handleRequest()
cnt = 12rs = org.postgresql.jdbc4.Jdbc4ResultSet@12eeffa4
msg = msgPrev = 0; msgCur = 1
end connectToPg()
end handleRequest()
---------------------------------------------
start handleRequest()
cnt = 12rs = org.postgresql.jdbc4.Jdbc4ResultSet@17b98b20
msg = msgPrev = 1; msgCur = 2
end connectToPg()
end handleRequest()

Why is it called 2 times?

matsjoyce
  • 5,744
  • 6
  • 31
  • 38
abkvandrd
  • 203
  • 1
  • 5
  • 17
  • I used PathHandler to route "/" & "/something" to different HttpHandler instances. Now, I get a similar result for the following code. `undertow.getListenerInfo().forEach(listenerInfo -> logger.info("Try {}:/{}", listenerInfo.getProtcol(), listenerInfo.getAddress()));`. I get the response printed twice like `Try http://127.0.0.1:8080`. Seems related. – nashter Jul 25 '17 at 14:21

1 Answers1

0

I would suggest to print out (or log out) exchange params to see what kind of request is being handled.

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

One option is that the second request is for /favicon.ico. You can also try to make a request in more controlled way - ie. using one of the REST clients or even curl.

atok
  • 5,880
  • 3
  • 33
  • 62