程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深化jetty的運用詳解

深化jetty的運用詳解

編輯:關於JAVA

深化jetty的運用詳解。本站提示廣大學習愛好者:(深化jetty的運用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是深化jetty的運用詳解正文


簡介: Jetty 是一個用 Java 完成、開源、基於規范的,並且具有豐厚功用的 Http 服務器和 Web 容器,可以收費的用於商業行為。Jetty 這個項目成立於 1995 年,如今曾經有十分多的成功產品基於 Jetty,比方 Apache Geromino, JBoss, IBM Tivoli, Cisco SESM 等。Jetty 可以用來作為一個傳統的 Web 服務器,也可以作為一個靜態的內容服務器,並且 Jetty 可以十分容易的嵌入到 Java 使用順序當中。

特性簡介

易用性

易用性是 Jetty 設計的根本准繩,易用性次要表現在以下幾個方面:

1.經過 XML 或許 API 來對 Jetty 停止配置;
2.默許配置可以滿足大局部的需求;
3.將 Jetty 嵌入到使用順序當中只需求十分少的代碼;
可擴展性

在運用了 Ajax 的 Web 2.0 的使用順序中,每個銜接需求堅持更長的時間,這樣線程和內存的耗費量會急劇的添加。這就使得我們擔憂整個順序會由於單個組件墮入瓶頸而影響整個順序的功能。但是有了 Jetty:

1.即便在有少量服務懇求的狀況下,零碎的功能也能堅持在一個可以承受的形態。
2.應用 Continuation 機制來處置少量的用戶懇求以及時間比擬長的銜接。
另外 Jetty 設計了十分良好的接口,因而在 Jetty 的某種完成無法滿足用戶的需求時,用戶可以十分方便地對 Jetty 的某些完成停止修正,使得 Jetty 適用於特殊的使用順序的需求。

易嵌入性

Jetty 設計之初就是作為一個優秀的組件來設計的,這也就意味著 Jetty 可以十分容易的嵌入到使用順序當中而不需求順序為了運用 Jetty 做修正。從某種水平上,你也可以把 Jetty 了解為一個嵌入式的Web服務器。

--------------------------------------------------------------------------------

部署使用順序

將自己的使用順序部署到 Jetty 下面是十分復雜的,首先將開發好的使用順序打成 WAR 包放到 Jetty 的 Webapps 目錄上面。然後用如下的命令來啟動 Jetty 服務器:Java –jar start.jar, 在啟動服務器後。我們就可以訪問我們的使用順序了,Jetty 的默許端口是 8080,WAR 的名字也就是我們的使用順序的 Root Context。例如一個典型的 URL 就是:http://127.0.0.1:8080/sample/index.jsp 。

--------------------------------------------------------------------------------

如何將 Jetty 嵌入到順序當中

將 Jetty 嵌入到順序當中是十分復雜的, 如 代碼 1 所示:首先我們創立一個 Server 對象, 並設置端口為 8080,然後為這個 Server 對象添加一個默許的 Handler。接著我們用配置文件 jetty.xml 對這個 server 停止設置,最後我們運用辦法 server.start() 將 Server 啟動起來就可以了。從這段代碼可以看出,Jetty 是十分合適用於作為一個組件來嵌入到我們的使用順序當中的,這也是 Jetty 的一個十分重要的特點。

清單 1. 代碼片斷

public class JettyServer {

    public static void main(String[] args) {
   Server server = new Server(8080);
   server.setHandler(new DefaultHandler());
   XmlConfiguration configuration = null;
   try {
  configuration = new XmlConfiguration(
new FileInputStream("C:/development/Jetty/jetty-6.1.6rc0/etc/jetty.xml"));
   } catch (FileNotFoundException e1) {
  e1.printStackTrace();
   } catch (SAXException e1) {
  e1.printStackTrace();
   } catch (IOException e1) {
  e1.printStackTrace();
   }

   try {   
  configuration.configure(server);
  server.start();
   } catch (Exception e) {
  e.printStackTrace();
   }
    }
}

接上去我們剖析一下 Jetty Server 是如何啟動的。首先我們留意到 Server 類,這個類實踐上承繼了 HttpServer, 當啟動 Jetty 服務器的時分,就是說,在 Jetty 根目錄下的命令行下假如輸出 java -jar start.jar etc/jetty.xml,留意這裡有一個配置文件 jetty.xml 做為運轉參數,這個參數也可以是其它的配置文件,可以是多個 XML 配置文件,其實這個配置文件好比我們運用 Struts 時的 struts-config.xml 文件,將運轉 Server 需求用到的組件寫在外面,比方上一節中 HttpServer 的配置需求的組件類都可以寫在這個配置文件中。按上述辦法啟動 Jetty Server 時,就會調用 Server 類外面的 main 辦法,這個入口辦法首先會結構一個 Server 類實例(其實也就結構了一個 HttpServer),創立實例的進程中就會結構 XmlConfiguration 類的對象來讀取參數配置文件,之後再由這個配置文件發生的 XmlConfiguration 對象來配置這個 Server,配置進程其實是運用了 Java 的反射機制,調用 Server 的辦法並傳入配置文件中所寫的參數來向這個 Server 添加 HttpListener,HttpContext,HttpHandler,以及 Web Application(對應於我們的 Web 使用)。

--------------------------------------------------------------------------------

Jetty 的 Continuation 機制

討論 Jetty 的 Continuation 機制,首先需求提到 Ajax 技術,Ajax 技術是以後開發 Web 使用的十分搶手的技術,也是 Web 2.0 的一個重要的組成局部。Ajax 技術中的一個中心對象是 XMLHttpRequest 對象,這個對象支持異步懇求,所謂異步懇求即是指當客戶端發送一個懇求到服務器的時分,客戶端不用不斷等候服務器的呼應。這樣就不會形成整個頁面的刷新,給用戶帶來更好的體驗。而當服務器端呼應前往時,客戶端應用一個 Javascript 函數對前往值停止處置,以更新頁面上的局部元素的值。但很多時分這種異步事情只是在很小一局部的狀況下才會發作,那麼怎樣保證一旦服務器端有了呼應之後客戶端馬上就知道呢,我們有兩種辦法來處理這個問題,一是讓閱讀器每隔幾秒懇求服務器來取得更改,我們稱之為輪詢。二是服務器維持與閱讀器的長時間的銜接來傳遞數據,長銜接的技術稱之為 Comet。

大家很容易就能發現輪詢方式的次要缺陷是發生了少量的傳輸糜費。由於能夠大局部向服務器的懇求是有效的,也就是說客戶端等候發作的事情沒有發作,假如有少量的客戶端的話,那麼這種網絡傳輸的糜費是十分凶猛的。特別是關於服務器端很久才更新的使用順序來講,比方郵件順序,這種糜費就更是宏大了。並且對 Server 端處置懇求的才能也相應進步了要求。假如很長時間才向 Server 端發送一次懇求的話,那麼客戶端就不能的失掉及時的呼應。

假如運用 Comet 技術的話,客戶端和服務器端必需堅持一個長銜接,普通狀況下,服務器端每一個 Servlet 都會獨占一個線程,這樣就會使得服務器端有很多線程同時存在,這在客戶端十分多的狀況下也會對服務器端的處置才能帶來很大的應戰。

Jetty 應用 Java 言語的非梗塞 I/O 技術來處置並發的少量銜接。 Jetty 有一個處置長銜接的機制:一個被稱為 Continuations 的特性。應用 Continuation 機制,Jetty 可以使得一個線程可以用來同時處置多個從客戶端發送過去的異步懇求,上面我們經過一個簡化的聊天順序的服務器端的代碼來演示不運用 Continuation 機制和運用 Continuation 的差異。

清單 2. Continuation 機制

public class ChatContinuation extends HttpServlet{

    public void doPost(HttpServletRequest request, HttpServletResponse response){
   postMessage(request, response);
    }

    private void postMessage(HttpServletRequest request, HttpServletResponse response)
    {
   HttpSession session = request.getSession(true);
   People people = (People)session.getAttribute(session.getId());
   if (!people.hasEvent())
   {
  Continuation continuation =
ContinuationSupport.getContinuation(request, this);
  people.setContinuation(continuation);
  continuation.suspend(1000);
   }
   people.setContinuation(null);
   people.sendEvent(response);
    }
}

大家留意到,首先獲取一個 Continuation 對象,然後把它掛起 1 秒鐘,直到超時或許兩頭被 resume 函數喚醒地位,這裡需求解釋的是,在調用完 suspend 函數之後,這個線程就可處置其他的懇求了,這也就大大進步了順序的並發性,使得長銜接可以取得十分好的擴展性。

假如我們不運用 Continuation 機制,那麼順序就如 清單 3 所示:

清單 3. 不運用 Continuation 機制

public class Chat extends HttpServlet{
    public void doPost(HttpServletRequest request, HttpServletResponse response){
   postMessage(request, response);
    }

    private void postMessage(HttpServletRequest request, HttpServletResponse response)
    {
   HttpSession session = request.getSession(true);

   People people = (People)session.getAttribute(session.getId());

   while (!people.hasEvent())
   {
  try {
Thread.sleep(1000);
  } catch (InterruptedException e) {
e.printStackTrace();
  }
   }
   people.setContinuation(null);
   people.sendEvent(response);   
    }
}

大家留意到在等候事情發作的時間裡,線程被掛起,直到所等候的事情發作為止,但在等候進程中,這個線程不能處置其他懇求,這也就形成了在客戶端十分多的狀況下服務器的處置才能跟不上的狀況。上面我們解釋一下 Jetty 的 Continuation 的機制是如何任務的。

為了運用 Continuatins,Jetty 必需配置為運用它的 SelectChannelConnector 處置懇求。這個 connector 構建在 java.nio API 之上,允許它維持每個銜接開放而不必耗費一個線程。當運用 SelectChannelConnector 時,ContinuationSupport.getContinuation() 提供一個 SelectChannelConnector.RetryContinuation 實例(但是,您必需針對 Continuation 接口編程)。當在 RetryContinuation 上調用 suspend() 時,它拋出一個特殊的運轉時異常 -- RetryRequest,該異常傳達到 servlet 外並且回溯到 filter 鏈,最後被 SelectChannelConnector 捕捉。但是不會發送一個異常呼應給客戶端,而是將懇求維持在未決 Continuations 隊列裡,則 HTTP 銜接堅持開放。這樣,用來服務懇求的線程前往給 ThreadPool,然後又可以用來服務其他懇求。暫停的懇求停留在未決 Continuations 隊列裡直到指定的過時時間,或許在它的 Continuation 上調用 resume() 辦法。當任何一個條件觸發時,懇求會重新提交給 servlet(經過 filter 鏈)。這樣,整個懇求被"重播"直到 RetryRequest 異常不再拋出,然後持續按正常狀況執行。

--------------------------------------------------------------------------------

Jetty 的平安性

為了避免任何人都有權限去封閉一個曾經開啟的 Jetty 服務器, 我們可以經過在啟動 Jetty 服務器的時分指定參數來停止控制,使得用戶必需提供密碼才干封閉 Jetty 服務器,啟動 Jetty 服務器的命令如下所示:

java -DSTOP.PORT=8079 -DSTOP.KEY=mypassword -jar start.jar

這樣,用戶在中止 Jetty 服務器的時分,就必需提供密碼“mypassword”。

--------------------------------------------------------------------------------

總結

Jetty 是一個十分方便運用的 Web 服務器,它的特點在於十分小,很容易嵌入到我們的使用順序當中,而且針對 Web 2.0 的 Ajax 技術停止了特別的優化,這也使得我們的運用 Ajax 的使用順序可以擁有更好的功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved