2012-03-21 132 views
0

在嵌入式Jetty容器中,我有一個servlet通過長輪詢將數據推送到客戶端,並且我想通過向客戶端發送消息來關閉服務器時通知客戶端在他們的連接關閉之前。當客戶收到這個消息時,它應該警告用戶並停止發出http請求。在Jetty關閉連接前優雅地停止servlet

不幸的是,Jetty在調用Server.stop()時所做的第一件事是關閉所有連接器,因此不會發送關閉消息。到目前爲止,我發現的唯一解決方案是在服務器上註冊一個LifeCycle.Listener,並在連接關閉之前調用它。

有沒有更好的方法來實現這一目標?我希望在連接關閉之前通過回調即將關閉的服務器來通知servlet。

回答

0

我想你做的是唯一的方法。縱觀碼頭8.1的代碼,調用停止()調用

 try 
     { 
      if (_state == __STOPPING || _state == __STOPPED) 
       return; 
      setStopping(); 
      doStop(); 
      setStopped(); 
     } 
     catch (Exception e) 
     { 
      setFailed(e); 
      throw e; 
     } 
     catch (Error e) 
     { 
      setFailed(e); 
      throw e; 
     } 

的setStopping()是

private void setStopping() 
{ 
    LOG.debug("stopping {}",this); 
    _state = __STOPPING; 
    for (Listener listener : _listeners) 
     listener.lifeCycleStopping(this); 
} 

所以註冊LifeCycle.Listener是其他任何東西之前真的叫的嘛。