程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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