2017-01-17 42 views
0

問候;Vertex 3:HTTP服務器的Handler <RoutingContext>會在事件/運行循環中執行還是在單獨的執行循環中執行?

我想知道是否創建了一個vertx httpServer並添加了一個處理類的處理請求。處理程序實例中的代碼是否會在同一個線程(事件循環線程)中執行,或者它將在單獨的線程/線程池中異步執行,並且不會減慢HTTPServer偵聽新的請求操作?

目前,我有一個Handler實例(一個實現Handler接口的spring signelton bean)。當httpserver的很多HTTP請求到達時,處理程序代碼緩慢處理請求(在請求完成很長時間後請求正在執行,但不會拋出vertex ThreadBlocked異常)

+0

vertx每個垂直代表單個線程。所以要回答你的問題,單線程將處理所有請求。 –

回答

0

簡短回答是肯定的。每個服務器Verticle都綁定到一個事件循環線程。每個處理程序綁定到同一個線程。這是很容易檢查:

public static void main(String[] args) { 
    Vertx vertx = Vertx.vertx(); 

    vertx.deployVerticle(new ServerVerticle()); 
} 

public static class ServerVerticle extends AbstractVerticle { 

    @Override 
    public void start() { 
     Router router = Router.router(vertx); 
     router.get("/").handler((r) -> { 
      System.out.println("Handler " + Thread.currentThread().getName()); 
      r.response().end(""); 
     }); 


     System.out.println("Main verticle " + Thread.currentThread().getName()); 
     vertx.createHttpServer().requestHandler(router::accept).listen(8888); 
    } 
} 

訪問服務器,你會發現,你的處理程序是相同的事件循環線程的服務器上。

如果你有緩慢的工作處理程序,使用EventBus和工人verticles:
http://vertx.io/docs/vertx-core/groovy/#worker_verticles