2016-03-03 49 views
0

我使用下面開始網狀JAX RS服務器:如何檢查是否Netty的賈克斯盧比服務器已準備就緒

NettyJaxrsServer netty = new NettyJaxrsServer(); 
    netty.setHostname(HOST); 
    netty.setPort(port);   
    netty.setDeployment(resteasyDeployment);   

    // Some optional extra configuration 
    netty.setKeepAlive(true); 
    netty.setRootResourcePath("/"); 
    netty.setSecurityDomain(null); 
    netty.setIoWorkerCount(16); 
    netty.setExecutorThreadCount(16); 

    LOGGER.info("Starting REST server on " + System.getenv("HOSTNAME"));   
    // Start the server 
    //("Starting REST server on " + System.getenv("HOSTNAME")); 
    netty.start(); 
    LOGGER.info("Started!"); 

這工作得很好,但也沒有辦法檢查服務器實際上是達並可以接受REST請求。我一直在向REST接口使用try/catch請求,並且在catch塊中等待時發生異常並重試。它的工作原理,但它是一個有點亂:

private void bringUpInterface(SlaveRestInterface slaveAgent, Target localTarget) { 
    LOGGER.info("Bringing up interface on " + localTarget.getHostName()); 
    Response r = null; 
    long startTime = System.currentTimeMillis(); 
    boolean isReady = false; 
    long wait = 50; 
    int count = 0; 
    try { 
     while (!isReady) { 
      try { 
       r = slaveAgent.ping(); 
       r.close(); 
       isReady = true; 
       long endTime = System.currentTimeMillis(); 
       SYS_LOGGER.info(" [OK]" + " (" + (endTime - startTime + "ms") + ")"); 

      } catch (ProcessingException ce) { 
       if(r != null) { 
        r.close(); 
       } 

       if (count == DEFAULT_TIMEOUT_SEC) { 
        throw new TimeoutException("Failed to start REST interface in " + DEFAULT_TIMEOUT_SEC 
          + "second(s)"); 
       } 
       Thread.sleep(wait); 
       wait *= 2; 
       count++; 
      } catch (Exception e) { 
       isReady = false; 
       throw new FatalException("Couldn't connect to REST interface on " + localTarget.getHostName()); 
      } 
     } 
    } catch (InterruptedException | TimeoutException ie) { 
     isReady = false; 
     throw new FatalException("REST interface did not come up on " + localTarget.getHostName()); 
    } 
} 

我想知道如果我可以覆蓋start()方法,並添加代碼ping的端點可能使用的HttpRequest。似乎沒有任何編程方式來查看服務器是否啓動。

+0

對於這項工作,服務器需要有兩個階段的設置,其中的第一步是打開服務器套接字,第二個是實際從中獲取新的連接。很少有java服務器具有這種設置,所以你最終不得不輪詢一個套接字來找出它。實際上有點難過。 –

回答

0

如果你可以掛接到Netty的,把你的ServerBootstrap並執行以下操作:

ChannelFuture bindFuture = serverBootstrap.bind(port); 
//Wait for port to be bound 
Channel channel = bindFuture.sync().channel(); 
//Bound here - start your tests   
//Wait for closure (optional) 
channel.closeFuture().sync(); 
相關問題