<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java socket編程

    http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
    http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/一,網(wǎng)絡(luò)編程中兩個(gè)主要的問題

    一個(gè)是如何準(zhǔn)確的定位網(wǎng)絡(luò)上一臺(tái)或多臺(tái)主機(jī),另一個(gè)就是找到主機(jī)后如何可靠高效的進(jìn)行數(shù)據(jù)傳輸。

    在TCP/IP協(xié)議中IP層主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚桑蒊P地址可以唯一地確定Internet上的一臺(tái)主機(jī)。

    而TCP層則提供面向應(yīng)用的可靠(tcp)的或非可靠(UDP)的數(shù)據(jù)傳輸機(jī)制,這是網(wǎng)絡(luò)編程的主要對象,一般不需要關(guān)心IP層是如何處理數(shù)據(jù)的。

    目前較為流行的網(wǎng)絡(luò)編程模型是客戶機(jī)/服務(wù)器(C/S)結(jié)構(gòu)。即通信雙方一方作為服務(wù)器等待客戶提出請求并予以響應(yīng)??蛻魟t在需要服務(wù)時(shí)向服務(wù)器提 出申請。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽網(wǎng)絡(luò)端口,一旦有客戶請求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽服務(wù)端口,使后來的客戶也 能及時(shí)得到服務(wù)。

    二,兩類傳輸協(xié)議:TCP;UDP

    TCP是Tranfer Control Protocol的 簡稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個(gè)順序的無差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個(gè)socket之間必須建 立連接,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送 或接收操作。

    UDP是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。

    比較:

    UDP:1,每個(gè)數(shù)據(jù)報(bào)中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接。

                2,UDP傳輸數(shù)據(jù)時(shí)是有大小限制的,每個(gè)被傳輸?shù)臄?shù)據(jù)報(bào)必須限定在64KB之內(nèi)。

               3,UDP是一個(gè)不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報(bào)并不一定以相同的次序到達(dá)接收方

    TCP:1,面向連接的協(xié)議,在socket之間進(jìn)行數(shù)據(jù)傳輸之前必然要建立連接,所以在TCP中需要連接

                    時(shí)間。

                2,TCP傳輸數(shù)據(jù)大小限制,一旦連接建立起來,雙方的socket就可以按統(tǒng)一的格式傳輸大的  

                        數(shù)據(jù)。

                 3,TCP是一個(gè)可靠的協(xié)議,它確保接收方完全正確地獲取發(fā)送方所發(fā)送的全部數(shù)據(jù)。

    應(yīng)用:

    1,TCP在網(wǎng)絡(luò)通信上有極強(qiáng)的生命力,例如遠(yuǎn)程連接(Telnet)和文件傳輸(FTP)都需要不定長度的數(shù)據(jù)被可靠地傳輸。但是可靠的傳輸是要付出代價(jià)的,對數(shù)據(jù)內(nèi)容正確性的檢驗(yàn)必然占用計(jì)算機(jī)的處理時(shí)間和網(wǎng)絡(luò)的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。

    2,UDP操作簡單,而且僅需要較少的監(jiān)護(hù),因此通常用于局域網(wǎng)高可靠性的分散系統(tǒng)中client/server應(yīng)用程序。例如視頻會(huì)議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會(huì)更合理一些。

    三,基于Socket的java網(wǎng)絡(luò)編程

    1,什么是Socket

    網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號唯一確定。

    但是,Socket所支持的協(xié)議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。

    2,Socket通訊的過程

    Server端Listen(監(jiān)聽)某個(gè)端口是否有連接請求,Client端向Server 端發(fā)出Connect(連接)請求,Server端向Client端發(fā)回Accept(接受)消息。一個(gè)連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。

    對于一個(gè)功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過程包含以下四個(gè)基本的步驟:

      (1) 創(chuàng)建Socket;

     ?。?) 打開連接到Socket的輸入/出流;

      (3) 按照一定的協(xié)議對Socket進(jìn)行讀/寫操作;

      (4) 關(guān)閉Socket.(在實(shí)際應(yīng)用中,并未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因?yàn)槌绦虮旧肀容^簡單,要求不高,所以并未造成什么影響。)

    3,創(chuàng)建Socket

    創(chuàng)建Socket

    java在包java.net中提供了兩個(gè)類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個(gè)封裝得非常好的類,使用很方便。其構(gòu)造方法如下:

      Socket(InetAddress address, int port);

      Socket(InetAddress address, int port, boolean stream);

      Socket(String host, int prot);

      Socket(String host, int prot, boolean stream);

      Socket(SocketImpl impl)

      Socket(String host, int port, InetAddress localAddr, int localPort)

      Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

      ServerSocket(int port);

      ServerSocket(int port, int backlog);

      ServerSocket(int port, int backlog, InetAddress bindAddr)

      其中address、host和port分別是雙向連接中另一方的IP地址、主機(jī)名和端 口號,stream指明socket是流socket還是數(shù)據(jù)報(bào)socket,localPort表示本地主機(jī)的端口號,localAddr和 bindAddr是本地機(jī)器的地址(ServerSocket的主機(jī)地址),impl是socket的父類,既可以用來創(chuàng)建serverSocket又可 以用來創(chuàng)建Socket。count則表示服務(wù)端所能支持的最大連接數(shù)。例如:學(xué)習(xí)視頻網(wǎng) http://www.xxspw.com

      Socket client = new Socket("127.0.01.", 80);

      ServerSocket server = new ServerSocket(80);

      注意,在選擇端口時(shí),必須小心。每一個(gè)端口提供一種特定的服務(wù),只有給出正確的端口,才 能獲得相應(yīng)的服務(wù)。0~1023的端口號為系統(tǒng)所保留,例如http服務(wù)的端口號為80,telnet服務(wù)的端口號為21,ftp服務(wù)的端口號為23, 所以我們在選擇端口號時(shí),最好選擇一個(gè)大于1023的數(shù)以防止發(fā)生沖突。

      在創(chuàng)建socket時(shí)如果發(fā)生錯(cuò)誤,將產(chǎn)生IOException,在程序中必須對之作出處理。所以在創(chuàng)建Socket或ServerSocket是必須捕獲或拋出例外。

    4,簡單的Client/Server程序

    1. 客戶端程序

      import java.io.*;

      import java.net.*;

      public class TalkClient {

        public static void main(String args[]) {

          try{

            Socket socket=new Socket("127.0.0.1",4700);

            //向本機(jī)的4700端口發(fā)出客戶請求

            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

            //由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

            PrintWriter os=new PrintWriter(socket.getOutputStream());

            //由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

            String readline;

            readline=sin.readLine(); //從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

            while(!readline.equals("bye")){

            //若從標(biāo)準(zhǔn)輸入讀入的字符串為 "bye"則停止循環(huán)

              os.println(readline);

              //將從系統(tǒng)標(biāo)準(zhǔn)輸入讀入的字符串輸出到Server

              os.flush();

              //刷新輸出流,使Server馬上收到該字符串

              System.out.println("Client:"+readline);

              //在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串

              System.out.println("Server:"+is.readLine());

              //從Server讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上

              readline=sin.readLine(); //從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

            } //繼續(xù)循環(huán)

            os.close(); //關(guān)閉Socket輸出流

            is.close(); //關(guān)閉Socket輸入流

            socket.close(); //關(guān)閉Socket

          }catch(Exception e) {

            System.out.println("Error"+e); //出錯(cuò),則打印出錯(cuò)信息

          }

      }

    }

     2. 服務(wù)器端程序

      import java.io.*;

      import java.net.*;

      import java.applet.Applet;

      public class TalkServer{

        public static void main(String args[]) {

          try{

            ServerSocket server=null;

            try{

              server=new ServerSocket(4700);

            //創(chuàng)建一個(gè)ServerSocket在端口4700監(jiān)聽客戶請求

            }catch(Exception e) {

              System.out.println("can not listen to:"+e);

            //出錯(cuò),打印出錯(cuò)信息

            }

            Socket socket=null;

            try{

              socket=server.accept();

              //使用accept()阻塞等待客戶請求,有客戶

              
    //請求到來則產(chǎn)生一個(gè)Socket對象,并繼續(xù)執(zhí)行

            }catch(Exception e) {

              System.out.println("Error."+e);

              //出錯(cuò),打印出錯(cuò)信息

            }

            String line;

            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

             //由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象

            PrintWriter os=newPrintWriter(socket.getOutputStream());

             //由Socket對象得到輸出流,并構(gòu)造PrintWriter對象

            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

             //由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

            System.out.println("Client:"+is.readLine());

            //在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串

            line=sin.readLine();

            //從標(biāo)準(zhǔn)輸入讀入一字符串

            while(!line.equals("bye")){

            //如果該字符串為 "bye",則停止循環(huán)

              os.println(line);

              //向客戶端輸出該字符串

              os.flush();

              //刷新輸出流,使Client馬上收到該字符串

              System.out.println("Server:"+line);

              //在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串

              System.out.println("Client:"+is.readLine());

              //從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上

              line=sin.readLine();

              //從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串

            }  //繼續(xù)循環(huán)

            os.close(); //關(guān)閉Socket輸出流

            is.close(); //關(guān)閉Socket輸入流

            socket.close(); //關(guān)閉Socket

            server.close(); //關(guān)閉ServerSocket

          }catch(Exception e){

            System.out.println("Error:"+e);

            //出錯(cuò),打印出錯(cuò)信息

          }

        }

      }

    5,支持多客戶的client/server程序

    前面的Client/Server程序只能實(shí)現(xiàn)Server和一個(gè)客戶的對話。在實(shí)際應(yīng)用 中,往往是在服務(wù)器上運(yùn)行一個(gè)永久的程序,它可以接收來自其他多個(gè)客戶端的請求,提供相應(yīng)的服務(wù)。為了實(shí)現(xiàn)在服務(wù)器方給多個(gè)客戶提供服務(wù)的功能,需要對上 面的程序進(jìn)行改造,利用多線程實(shí)現(xiàn)多客戶機(jī)制。服務(wù)器總是在指定的端口上監(jiān)聽是否有客戶請求,一旦監(jiān)聽到客戶請求,服務(wù)器就會(huì)啟動(dòng)一個(gè)專門的服務(wù)線程來響 應(yīng)該客戶的請求,而服務(wù)器本身在啟動(dòng)完線程之后馬上又進(jìn)入監(jiān)聽狀態(tài),等待下一個(gè)客戶的到來。

    posted @ 2016-06-19 22:20 youngturk 閱讀(165) | 評論 (0)編輯 收藏

    java 環(huán)境變量配置

    1. java_home C:\jdk1.6.0_30 2. Path ;%java_home%\bin 3. classpath .;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar

    posted @ 2016-06-19 22:18 youngturk 閱讀(360) | 評論 (0)編輯 收藏

    JVM介紹

    http://www.cnblogs.com/sunada2005/p/3577799.html

    posted @ 2016-06-19 22:11 youngturk 閱讀(147) | 評論 (0)編輯 收藏

    關(guān)于Tomcat 6的熱部署和熱加載 轉(zhuǎn)

    http://greemranqq.iteye.com/blog/1774258 
    http://www.cnblogs.com/-lpf/p/4317281.html
    我在項(xiàng)目開發(fā)過程中,經(jīng)常要改動(dòng)JAVA/JSP 文件,但是又不想從新啟動(dòng)服務(wù)器(服務(wù)器從新啟動(dòng)花時(shí)間),想直接獲得(debug)結(jié)果.有兩種方式熱部署 和熱加載:

     

    1.熱加載:在server.xml -> context 屬性中 設(shè)置 reloadable="true"

     

    Java代碼  收藏代碼
    1. <Context docBase="xxx" path="/xxx" reloadable="true"/>  

        

     

    2. 熱部署:在server.xml -> context 屬性中 設(shè)置  autoDeploy="true"

      

    Java代碼  收藏代碼
    1. <Context docBase="xxx" path="/xxx" autoDeploy="true"/>  

     

    3.區(qū)別:

          熱加載:服務(wù)器會(huì)監(jiān)聽 class 文件改變,局部進(jìn)行加載,不清空session ,不釋放內(nèi)存。開發(fā)中用的多,但是要考慮內(nèi)存溢出的情況。

     

          熱部署: 整個(gè)項(xiàng)目從新部署,包括你從新打上.war 文件。 會(huì)清空session ,釋放內(nèi)存。項(xiàng)目打包的時(shí)候用的多。

     

    也可以通過Eclipse上設(shè)置實(shí)現(xiàn)上述配置文件的修改 

    Eclipse的工程名右鍵: properties->Tomcat->General->Make this context as reloadable(reloadable="true")不要選中 Eclipse的工程名右鍵:Tomcat project->Update Context Definition

     

    注意:source 屬性有些版本不支持,容易出錯(cuò),去掉就行 

    二。

    不重啟Tomcat有兩種方式:熱部署、熱加載 
      熱部署:容器狀況在運(yùn)行時(shí)重新部署整個(gè)項(xiàng)目。這類環(huán)境下一般整個(gè)內(nèi)存會(huì)清空,重新加載,這類方式 
      有可能會(huì)造成sessin丟失等環(huán)境。tomcat 6確實(shí)可以熱部署了,而且對話也沒丟. 
      熱加載:最好是在調(diào)試過程中使用,免患上整個(gè)項(xiàng)目加載,Debug標(biāo)準(zhǔn)樣式支持熱加載。容器狀況在運(yùn)行時(shí)重 
      新加載轉(zhuǎn)變編譯后的類。在這類環(huán)境下內(nèi)存不會(huì)清空,sessin不會(huì)丟失,但容易造成內(nèi)存溢出,或者找不到方 
      法。一般轉(zhuǎn)變類的布局和模型就會(huì)有異常,在已經(jīng)有的變量和方法中轉(zhuǎn)變是不會(huì)出問題的(Eclipse、 
      MyEclipse8、JBuilder、IntelliJ IDEA…)。 
      常用的一定第二種:熱加載了,設(shè)置如下! 
      在tomcat的conf中的server.xml中的host設(shè)置中添加<Context path="/test" 
      docBase="D:/develop/test" 
      debug="0" privileged="true" reloadable="true"/> 
      reloadable="true" !最重要 
      它內(nèi)里有很多屬性,意義如下: 
      1>path:指定拜候該web應(yīng)用的URL進(jìn)口; 
      2>docBase:指定web應(yīng)用的文件路徑,可以給定絕對路徑,也可以給定相對于<Host>的appBase屬性【默認(rèn) 
      指向tomcat的webapps】的相對于徑;要是Web應(yīng)用是個(gè)war文件,則指定war文件的路徑。 
      3>className:指定使成為事實(shí)Context組件的Java類的名字,這個(gè)Java類必須使成為事實(shí)org.apache.catalina.Context 
      接口,該屬性的默認(rèn)值為org.apache.catalina.StandardContext。 
      4>reloadable:要是這個(gè)屬性設(shè)置為true,Tomcat服務(wù)器在運(yùn)行狀況下會(huì)監(jiān)視在WEB-INF/classess和WEB- 
      INF/lib目次下的class文件的改動(dòng),以及監(jiān)視web應(yīng)用的WEB-INF/web.xml文件的改動(dòng)。要是檢測到的class 
      文件或者web.xml文件被更新,服務(wù)器會(huì)自動(dòng)加載Web應(yīng)用。該屬性的默認(rèn)值為false.在web應(yīng)用的開發(fā)和調(diào) 
      試階段,把reloadable設(shè)為true,可以方便對web應(yīng)用的調(diào)試。在web應(yīng)用正式發(fā)布階段,把reloadable設(shè)為 
      false,可以減低tomcat的運(yùn)行負(fù)荷,提高Tomcat的運(yùn)行性能。 
      5>cachingAllowed:要是為true,標(biāo)示允許啟用靜態(tài)資源的緩存。使用緩存能提高拜候靜態(tài)資源的效率。 
      tomcat把那一些時(shí)常被客戶端拜候的靜態(tài)資源(如:HTML文檔、圖片文件和聲響文件等)放在緩存中,當(dāng)客戶再 
      次拜候有關(guān)靜態(tài)資源時(shí),Tomcat只需直接從緩存中讀取相關(guān)數(shù)據(jù),無須反復(fù)讀取文件系統(tǒng)中的文件。該屬 
      性的默認(rèn)值為true. 
      6>cacheMaxSize:設(shè)定靜態(tài)資源的緩存的最大容量,以K為單元。要是,要是該屬性為100,表示100K,默認(rèn) 
      為10240(即10M)。 
      7>workDir:指定web應(yīng)用的工作目次。Tomcat在運(yùn)行時(shí)會(huì)把與這個(gè)web應(yīng)用相關(guān)的臨應(yīng)試文章件放在此目次下。 
      8>uppackWar:要是此項(xiàng)設(shè)為true,表示將把web應(yīng)用的war文件睜開為開放目次布局后再運(yùn)行。要是設(shè)為 
      false,則直接運(yùn)行war文件。該屬性的默認(rèn)值為true。 
      同志們,使用tomcat6.0的注意了啊。當(dāng)你使用我的方法設(shè)置tomcat后,你的myeclipse報(bào)如下錯(cuò)誤時(shí),不要驚慌,這是正確的,且聽我解釋。 
      console報(bào)錯(cuò): 
      警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ' debug' to '0' did not find a matching property. 這是由于你使用的是tomcat6.0,由于它路程經(jīng)過過程其他途徑對debug="0"這個(gè)屬性進(jìn)行了使成為事實(shí),所以這搭不能再有此屬性。你只要將它去掉,就能夠沒事了啟動(dòng)了。 也就是說去掉debug="0“,萬事OK,呵呵。 


    (轉(zhuǎn))

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

    針對需要重新啟動(dòng)tomcat的服務(wù),重新啟動(dòng)方式為:

    安裝版:tomcat/bin/shotdown.bat      關(guān)閉tomcat服務(wù)

              tomcat/bin/startup.bat         開啟tomcat服務(wù)

    或者-->我的電腦-->管理-->服務(wù)和應(yīng)用程序/服務(wù)-->找到Apache Tomcat重啟

    posted @ 2016-06-19 21:03 youngturk 閱讀(279) | 評論 (0)編輯 收藏

    apache tomcat mod_js配置整合,

    http://blog.sina.com.cn/s/blog_3c9872d00102w00y.html
    Apache與Tomcat整合應(yīng)用是一個(gè)老話題,不算新技能,但對非運(yùn)維人員在配置過程中或許也會(huì)遇到一些問題。這里只是把自己多回配置的過程做一個(gè)摘錄,供自己翻閱并望對過路的人有用。
    Apache是當(dāng)下在Windows、Unix、Linux 等操作系統(tǒng)中最流行的Web服務(wù)器軟件之一,其反應(yīng)速度快、運(yùn)行效率高,不僅支持HTML等靜態(tài)頁面,在加載插件后也可支持 PHP 頁面等。Tomcat是Apache軟件基金協(xié)會(huì)與Sun公司聯(lián)合開發(fā)的Web服務(wù)器,除支持HTML靜態(tài)頁面外,還是JSP、Servlet等JAVA WEB應(yīng)用的服務(wù)器。在相同運(yùn)行環(huán)境下,Tomcat對靜態(tài)頁面的反應(yīng)速度沒有Apache靈敏,整合 Apache與Tomcat能使系統(tǒng)運(yùn)行于一個(gè)良好環(huán)境下,實(shí)現(xiàn)JAVA的動(dòng)態(tài)與靜態(tài)頁面分離,不僅讓系統(tǒng)更安全,同時(shí)也可提高系統(tǒng)效率。

    一、JAVA應(yīng)用基礎(chǔ)架構(gòu)

    通用的JAVA應(yīng)用架構(gòu)如下,包括WEB Server、APP Server和DB Server三個(gè)部分:
    Apache和Tomcat整合配置實(shí)現(xiàn)JAVA應(yīng)用的“動(dòng)靜”分離
    1、WEB Server
    WEB Server置于企業(yè)防火墻外,這個(gè)防火墻也可以認(rèn)為是一個(gè)CISCO路由器,在CISCO路由器上開放兩個(gè)端口為:80和443,其中:
    80端口:用于正常的http訪問
    443端口:用于https訪問,即如果你在ie里打入https://xxx.xxx.xx這樣的地址,默認(rèn)走的是443這個(gè)端口
    WebServer專門用于解析HTML、JS(JavaScript)、CSS、JPG/GIF等圖片格式文件、TXT、VBSCRIPT、PHP等“靜態(tài)”網(wǎng)頁內(nèi)容。
    2、APP Server
    APP Server置于企業(yè)防火墻內(nèi),它和Web Server之間的連接必須且一定為內(nèi)部IP連接。App Server用于解析我們的任何需要Java編譯器才能解析的“動(dòng)態(tài)”網(wǎng)頁,其實(shí)App Server本身也能解析任何靜態(tài)網(wǎng)頁的。在應(yīng)用中我們這樣來想一下:我們讓負(fù)責(zé)專門解析靜態(tài)網(wǎng)頁的Web Server來解析html等內(nèi)容,而讓App Server專門用于解析任何需要Java編譯器才能解析的東西,讓它們各司其職。這樣作的好處:
      1)為App Server“減壓”,同時(shí)也提高了性能;
      2)不用再把8080這個(gè)端口暴露在internet上,也很安全,畢竟我們的App Server上是有我們的代碼的,就算是編譯過的代碼也容易被“反編譯”,這是很不安全的;
      3)為將來進(jìn)一步的“集群擴(kuò)展”打好了基礎(chǔ)。
    3、DB Server
     比方說我們用MySQL,它需要通過3306與App Server進(jìn)行連接,那么這個(gè)1521我們稱為數(shù)據(jù)庫連接端口,如果把它暴露在Internet上就比較危險(xiǎn),就算密碼很復(fù)雜,但 對于高明的黑客來說,要攻破你的口令也只是時(shí)間上的問題而己。因此我們把我們的DB Server也和App Server一樣,置于內(nèi)網(wǎng)的防火墻,任何的DB連接與管理只能通過內(nèi)網(wǎng)來訪問。
    二、系統(tǒng)安裝與配置
    系統(tǒng)安裝包括MySQL的安裝,WEB Server即Apache的安裝,App Server即Tomcat的安裝。關(guān)于這三個(gè)系統(tǒng)安裝網(wǎng)上相關(guān)的文檔很多,此處略去。以下主要摘錄需要重點(diǎn)配置的內(nèi)容。
    1、Apache的配置
    做技術(shù)的人應(yīng)該都會(huì)Apache的基礎(chǔ)配置,如果不會(huì)確實(shí)需要學(xué)一學(xué)。
    Apache的配置主要集中在httpd.conf文件中,它位于Apache的安裝目錄下,比如我的是在“C:\webserver\apache\apache22\conf”目錄下。用Ultraedit或Notepad++編輯器打開文件,通常需要修改的內(nèi)容包括ServerName、DocumentRoot、VirtualHost內(nèi)容等。此處我修改的內(nèi)容包括:
    1)DocumentRoot原目錄為C:/webserver/apache/apache22/htdocs,修改為D:/WWW/apache/htdocs,將網(wǎng)站發(fā)布路徑與Apache安裝路徑分開;
    2)找到如下紅色標(biāo)示內(nèi)容:
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        deny from all
    把這個(gè)”deny from all”改成”allow fromall’。
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        allow from all
    以免訪問Apache根目錄下的文件時(shí)出現(xiàn)以下錯(cuò)誤提示:
    Apache和Tomcat整合配置實(shí)現(xiàn)JAVA應(yīng)用的“動(dòng)靜”分離
    3)再找到下面這樣的行
    Options FollowSymLinks indexes
    把它注掉改成下面這樣
    #Options FollowSymLinks indexes
    Options None
    以免在訪問Apache目錄時(shí)出現(xiàn)直接列表顯示子目錄或目錄下文件的不安全情況,如下圖樣子:
    Apache和Tomcat整合配置實(shí)現(xiàn)JAVA應(yīng)用的“動(dòng)靜”分離
    以上配置修改完成后重啟Apache服務(wù),保證要能正常運(yùn)行。
    三、Apache與Tomcat的整合配置
    Apache(Web Server)負(fù)責(zé)處理HTML靜態(tài)內(nèi)容,Tomcat(App Server)負(fù)責(zé)處理動(dòng)態(tài)內(nèi)容;原理圖如下:
    Apache和Tomcat整合配置實(shí)現(xiàn)JAVA應(yīng)用的“動(dòng)靜”分離
    上述架構(gòu)的原理是: 在Apache中裝載一個(gè)模塊,這個(gè)模塊叫mod_jk; Apache通過80端口負(fù)責(zé)解析任何靜態(tài)web內(nèi)容; 任何不能解析的內(nèi)容,用表達(dá)式告訴mod_jk,讓mod_jk派發(fā)給相關(guān)的App Server去解釋。
    因此,首先把 mod_jk-1.2.31-httpd-2.2.3(可從網(wǎng)上搜索下載該模塊,如http://download.csdn.net/detail/shangkaikuo/4494837)拷貝到 "/Apache2.2/modules" 目錄下。接下來:
    1、添加workers.properties文件
    在 “/Tomcat 8.0/conf ” 文件夾下(也可以是其它目錄下)增加 workers.properties 文件,輸入以下內(nèi)容。(將其中相應(yīng)目錄替換成自己本地tomcat或jre安裝目錄)
     #讓mod_jk模塊認(rèn)識(shí)Tomcat
     workers.tomcat_home=d:/webserver/tomcat/tomcat8
     #讓mod_jk模塊認(rèn)識(shí)JRE
     workers.java_home=C:/java/jdk1.8.0_45/jre
     #指定文件路徑分割符
     ps=/
     ##
     #工作端口,此端口應(yīng)該與server.xml中Connector元素的AJP/1.3協(xié)議所使用的端口相匹配
     worker.list=AJP13
     worker.AJP13.port=8009
     #Tomcat服務(wù)器的地址
     worker.AJP13.host=localhost
     #類型
     worker.AJP13.type=ajp13
     #負(fù)載平衡因數(shù)
     worker.AJP13.lbfactor=1

    **注意:worker.list=AJP13中,AJP13為自定義名稱,但此名稱必須與下文所述的 “/Apache 2.2/conf/httpd.conf ” 文件中,JkMount指令對應(yīng)的名稱相匹配。
    2、httpd.conf文件中添加配置內(nèi)容
    加入workers.properties文件后,可修改 “/Apache 2.2/conf/httpd.conf ” 文件,加入以下配置,注意JkMount指令中的變量必須與worker.list所配置的名稱相同。

    # 此處mod_jk-1.2.31-httpd-2.2.3文件為你下載的文件
    LoadModule  jk_module  modules/mod_jk-1.2.31-httpd-2.2.3.so
    # 指定tomcat監(jiān)聽配置文件地址
    JkWorkersFile  "C:/webserver/tomcat/tomcat8/conf/workers.properties"
    #JkWorkersFile  "C:/webserver/apache/apache22/conf/workers.properties"
    # 指定日志存放位置
    JkLogFile  "C:/webserver/tomcat/tomcat8/logs/mod_jk2.log"
    JkLogLevel  info
    -virtualhost *-
        ServerName  localhost
        DocumentRoot  "C:/webserver/tomcat/tomcat8/webapps"
        DirectoryIndex  index.html index.htm index.jsp index.action
        ErrorLog  logs/shsc-error_log.txt
        CustomLog  logs/shsc-access_log.txt common
        JkMount  /*WEB-INF AJP13
        JkMount  /*j_spring_security_check AJP13
        JkMount  /*.action AJP13
        JkMount  /servlet/* AJP13
        JkMount  /*.jsp AJP13
        JkMount  /*.do AJP13
        JkMount  /*.action AJP13
    -/virtualhost-

    上述配置中的紅色內(nèi)容是為了告訴Apache哪些交給Tomcat去處理,其它的都交由Apache自身去處理。
    其中綠色的兩句比較關(guān)鍵,分別告訴:Apache載入一個(gè)額外的插件,用于連接tomcat;  連接時(shí)的配置參數(shù)描述位于Tomcat安裝目錄的/conf目錄下的一個(gè)叫workers.properties文件中,mod_jk一般使用ajp13協(xié)議連接,使用的是tomcat的8009端口。
    完成以上配置后,重啟 Apache、Tomcat。此時(shí)Apache、Tomcat的默認(rèn)目錄為 "C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps ”,Apache使用默認(rèn)的80端口、Tomcat端口改成1080或其它非8080默認(rèn)端口(修改是為了安全,也可以不用修改)。在Tomcat默認(rèn)目錄下添加test目錄,在該目錄下加入index.jsp頁面,然后通過http://localhost/test/index.jsp試試是否可以正常訪問,如頁面可正常訪問,證明整合配置已經(jīng)成功。
    至此,似乎整個(gè)配置工作已經(jīng)完成,但是如果你想試著把靜態(tài)的HTML頁面放到Apache的htdocs發(fā)布目錄下,把JSP等動(dòng)態(tài)內(nèi)容放到Tomcat的webapps目錄下(該目錄下不存放*.html文件),然后通過http://localhost/index.html想訪問Apache目錄下的內(nèi)容,你會(huì)發(fā)現(xiàn)404之類的不能訪問的錯(cuò)誤。如何解決,這里暫時(shí)賣個(gè)關(guān)子.......如果你能看出問題,能容易解決掉,就誠摯為你點(diǎn)個(gè)贊!
     

    posted @ 2016-06-19 20:42 youngturk 閱讀(216) | 評論 (0)編輯 收藏

    關(guān)于Tomcat和Tomcat的面試問題

    http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti 
    http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti

    關(guān)于Tomcat和Tomcat的面試問題

    一、Tomcat的缺省是多少,怎么修改

    Tomcat的缺省端口號是8080.
    修改Tomcat端口號:
    1.找到Tomcat目錄下的conf文件夾
    2.進(jìn)入conf文件夾里面找到server.xml文件
    3.打開server.xml文件
    4.在server.xml文件里面找到下列信息
    maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
    enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
    connectionTimeout=”20000″ disableUploadTimeout=”true” />
    5.把port=”8080″改成port=”8888″,并且保存
    6.啟動(dòng)Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/

    7、tomcat默認(rèn)采用的BIO模型,在幾百并發(fā)下性能會(huì)有很嚴(yán)重的下降。tomcat自帶還有NIO的模型,另外也可以調(diào)用APR的庫來實(shí)現(xiàn)操作系統(tǒng)級別控制。
      NIO模型是內(nèi)置的,調(diào)用很方便,只需要將上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的參數(shù)配置,默認(rèn)的是HTTP/1.1。
        <Connector port=”8080″  
                   protocol=”org.apache.coyote.http11.Http11NioProtocol” 
                   connectionTimeout=”20000″ 
                   redirectPort=”8443″  
                   maxThreads=”500″  
                   minSpareThreads=”20″ 
                   acceptCount=”100″
                   disableUploadTimeout=”true”
                   enableLookups=”false”  
                   URIEncoding=”UTF-8″ />

    二、tomcat 如何優(yōu)化?

     1、優(yōu)化連接配置.這里以tomcat7的參數(shù)配置為例,需要修改conf/server.xml文件,修改連接數(shù),關(guān)閉客戶端dns查詢。

    參數(shù)解釋:

     URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個(gè)mod_encoding,還要手工編譯

     maxSpareThreads : 如果空閑狀態(tài)的線程數(shù)多于設(shè)置的數(shù)目,則將這些線程中止,減少這個(gè)池中的線程總數(shù)。

     minSpareThreads : 最小備用線程數(shù),tomcat啟動(dòng)時(shí)的初始化的線程數(shù)。

     enableLookups : 這個(gè)功效和Apache中的HostnameLookups一樣,設(shè)為關(guān)閉。

     connectionTimeout : connectionTimeout為網(wǎng)絡(luò)連接超時(shí)時(shí)間毫秒數(shù)。

     maxThreads : maxThreads Tomcat使用線程來處理接收的每個(gè)請求。這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù),即最大并發(fā)數(shù)。

     acceptCount : acceptCount是當(dāng)線程數(shù)達(dá)到maxThreads后,后續(xù)請求會(huì)被放入一個(gè)等待隊(duì)列,這個(gè)acceptCount是這個(gè)隊(duì)列的大小,如果這個(gè)隊(duì)列也滿了,就直接refuse connection

     maxProcessors與minProcessors : 在 Java中線程是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線程無關(guān)的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時(shí)間保持最低,從而接受更多的請求。

    通常Windows是1000個(gè)左右,Linux是2000個(gè)左右。

     useURIValidationHack:

    我們來看一下tomcat中的一段源碼:

    【security】

            if (connector.getUseURIValidationHack()) {

                String uri = validate(request.getRequestURI());

                if (uri == null) {

                    res.setStatus(400);

                    res.setMessage(“Invalid URI”);

                    throw new IOException(“Invalid URI”);

                } else {

                    req.requestURI().setString(uri);

                    // Redoing the URI decoding

                    req.decodedURI().duplicate(req.requestURI());

                    req.getURLDecoder().convert(req.decodedURI(), true);

    可以看到如果把useURIValidationHack設(shè)成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。

     enableLookups=”false” : 為了消除DNS查詢對性能的影響我們可以關(guān)閉DNS查詢,方式是修改server.xml文件中的enableLookups參數(shù)值。

     disableUploadTimeout :類似于Apache中的keeyalive一樣

    給Tomcat配置gzip壓縮(HTTP壓縮)功能

    compression=”on” compressionMinSize=”2048″

    compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

    HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請求網(wǎng)頁后,從服務(wù)器端將網(wǎng)頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對于普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對動(dòng)態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進(jìn)行壓縮,壓縮效率驚人。

    1)compression=”on” 打開壓縮功能

    2)compressionMinSize=”2048″ 啟用壓縮的輸出內(nèi)容大小,這里面默認(rèn)為2KB

    3)noCompressionUserAgents=”gozilla, traviata” 對于以下的瀏覽器,不啟用壓縮

    4)compressableMimeType=”text/html,text/xml” 壓縮類型

    最后不要忘了把8443端口的地方也加上同樣的配置,因?yàn)槿绻覀冏遠(yuǎn)ttps協(xié)議的話,我們將會(huì)用到8443端口這個(gè)段的配置,對吧?

    <!–enable tomcat ssl–>

        <Connector port=”8443″ protocol=”HTTP/1.1″

                   URIEncoding=”UTF-8″  minSpareThreads=”25″ maxSpareThreads=”75″

              enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″

              acceptCount=”300″  maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″

              useURIValidationHack=”false”

                        compression=”on” compressionMinSize=”2048″

                        compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

                    SSLEnabled=”true”

               scheme=”https” secure=”true”

               clientAuth=”false” sslProtocol=”TLS”

               keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”

          />

    好了,所有的Tomcat優(yōu)化的地方都加上了。

    2、優(yōu)化JDK
    Tomcat默認(rèn)可以使用的內(nèi)存為128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下設(shè)置:
    JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化內(nèi)存大小] -Xmx[可以使用的最大內(nèi)存]

    設(shè)置環(huán)境變量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化內(nèi)存大小] -Xmx[可以使用的最大內(nèi)存]”
    一般說來,你應(yīng)該使用物理內(nèi)存的 80% 作為堆大小。如果本機(jī)上有Apache服務(wù)器,可以先折算Apache需要的內(nèi)存,然后修改堆大小。建議設(shè)置為70%;建議設(shè)置[[初始化內(nèi)存大小]等于[可以使用的最大內(nèi)存],這樣可以減少平凡分配堆而降低性能。
    本例使用加入環(huán)境變量的方式:
    # vi /etc/profile
    加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700
    # source /etc/profile

    【參數(shù)說明】

    -Xms 是指設(shè)定程序啟動(dòng)時(shí)占用內(nèi)存大小。一般來講,大點(diǎn),程序會(huì)啟動(dòng)的 快一點(diǎn),但是也可能會(huì)導(dǎo)致機(jī)器暫時(shí)間變慢。

    -Xmx 是指設(shè)定程序運(yùn)行期間最大可占用的內(nèi)存大小。如果程序運(yùn)行需要占 用更多的內(nèi)存,超出了這個(gè)設(shè)置值,就會(huì)拋出OutOfMemory 異常。

    -Xss 是指設(shè)定每個(gè)線程的堆棧大小。這個(gè)就要依據(jù)你的程序,看一個(gè)線程 大約需要占用多少內(nèi)存,可能會(huì)有多少線程同時(shí)運(yùn)行等。

    -XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64 。

    -XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。

    三、tomcat 有那幾種Connector 運(yùn)行模式?

    tomcat的運(yùn)行模式有3種.修改他們的運(yùn)行模式.3種模式的運(yùn)行是否成功,可以看他的啟動(dòng)控制臺(tái),或者啟動(dòng)日志.或者登錄他們的默認(rèn)頁面http://localhost:8080/查看其中的服務(wù)器狀態(tài)。

    1)bio

    默認(rèn)的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持.

    2)nio

    利用java的異步io護(hù)理技術(shù),no blocking IO技術(shù).

    想運(yùn)行在該模式下,直接修改server.xml里的Connector節(jié)點(diǎn),修改protocol為

     <Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
        connectionTimeout=”20000″
        URIEncoding=”UTF-8″
        useBodyEncodingForURI=”true”
        enableLookups=”false”
        redirectPort=”8443″ />

    啟動(dòng)后,就可以生效。

    3)apr

    安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.

    必須要安裝apr和native,直接啟動(dòng)就支持apr。下面的修改純屬多余,僅供大家擴(kuò)充知識(shí),但仍然需要安裝apr和native

    如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol

    posted @ 2016-06-19 10:31 youngturk 閱讀(404) | 評論 (0)編輯 收藏

    spring httpInvoke 解決遠(yuǎn)程調(diào)用遠(yuǎn)程的類的方法

    http://zhidao.baidu.com/link?url=6FrnwvBQEZhjM-ooNCuiAra7T6qi9FsFhFvkHBKaOjqovZR86OCsIePi-05nM-fxRrlInEGbElSxlhgO6X7JsaGNdQdNrQ2xE58wglgeQO3 http://blog.csdn.net/liaq325/article/details/8281550 摘自以上 spring httpInvoke

    spring httpInvoke 基于spring架構(gòu)的服務(wù)器之間的遠(yuǎn)程調(diào)用實(shí)現(xiàn)。通過spring httpInvoke,可以調(diào)用遠(yuǎn)程接口,進(jìn)行數(shù)據(jù)交互、業(yè)務(wù)邏輯操作

    服務(wù)器端:(被調(diào)用一方)

    [java] view plain copy
    1. public  class User implements Serializable{//必須實(shí)現(xiàn)serializable接口,遠(yuǎn)程調(diào)用的基礎(chǔ)  
    2.     private String username;  
    3.     private Date birthday;  
    4.     //構(gòu)造方法  
    5.     //set get 方法  
    6. }  
    7. public interface UserService{  
    8.     User getUser(String username);  
    9. }  
    10. public UserServiceImpl implements UserService{  
    11.     //實(shí)現(xiàn)userService  
    12. }  
    重要的配置文件來了。。。。
    remote-servlet.xml放在項(xiàng)目根目錄下面,跟web.xml相同的級別

    暴露給調(diào)用端:服務(wù)的實(shí)現(xiàn),接口

    [html] view plain copy
    1. <bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
    2.     <property name="service">  
    3.         <bean class="com.cd.Liaq.UserServiceImpl"/>  
    4.     </property>  
    5.     <property name="serviceInterface">  
    6.         <value>com.cd.Liaq.UserService</value>  
    7.     </property>  
    8. </bean>  
    暴露了服務(wù)的實(shí)現(xiàn)和接口,那么怎么訪問服務(wù)呢?
    spring封裝訪問url

    [html] view plain copy
    1. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
    2.     第一種:<property name="urlMap">  
    3.         <map>  
    4.             <entry key="TestUser" value-ref="userService"/>  
    5.         </map>  
    6.     </property>  
    7.     第二種:<prop key="/TestUser">userService</prop>  
    8. </bean>  
    web.xml:配置dispatcherServlet共調(diào)用一方使用

    [html] view plain copy
    1. <!-- spring遠(yuǎn)程調(diào)用 -->  
    2. <servlet>  
    3.     <servlet-name>remote</servlet-name>  
    4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    5.     <load-on-startup>1</load-on-startup>  
    6. </servlet>  
    7. <servlet-mapping>  
    8.     <servlet-name>remote</servlet-name>  
    9.     <url-pattern>/remoting/*</url-pattern>  
    10. </servlet-mapping>  
    到處為止:被調(diào)用端一方完畢!!!!
    客戶端調(diào)用:

    [html] view plain copy
    1. <!-- 通過http連接遠(yuǎn)程系統(tǒng) -->  
    2. <bean id="memberService"  
    3.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
    4.     <property name="serviceUrl">  
    5.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
    6.     </property>  
    7.     <property name="serviceInterface">  
    8.         <value>com.cd.Liaq.UserService</value>  
    9.     </property>  
    10. </bean>  
    通過spring容器調(diào)用UserService,用到HttpInvokerProxyFactoryBean工廠,配置serviceUrl和serviceInterface
    為了提高效率:客戶端使用Commons-HttpClient,導(dǎo)入改包,改寫配置

    [html] view plain copy
    1. <bean id="memberService"  
    2.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
    3.     <property name="serviceUrl">  
    4.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
    5.     </property>  
    6.     <property name="serviceInterface">  
    7.         <value>com.cd.Liaq.UserService</value>  
    8.     </property>  
    9.      <property name="httpInvokerRequestExecutor"> //使用指定的執(zhí)行器執(zhí)行  
    10.         <ref bean="httpInvokerRequestExecutor" />    
    11.     </property>    
    12. </bean>  
    13. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
    14.     <property name="httpClient">    
    15.         <bean class="org.apache.commons.httpclient.HttpClient">    
    16.             <property name="connectionTimeout" value="2000" />    
    17.             <property name="timeout" value="5000" />    
    18.         </bean>    
    19.     </property>    
    20. </bean>    

    配置超時(shí)時(shí)間timeout和連接超時(shí)connectionTimeout兩個(gè)屬性
    優(yōu)化執(zhí)行器:多線程===被調(diào)用端響應(yīng)時(shí)間縮短很多

    [html] view plain copy
    1. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
    2.     <property name="httpClient">    
    3.         <bean class="org.apache.commons.httpclient.HttpClient">    
    4.             <property name="connectionTimeout" value="2000" />    
    5.             <property name="timeout" value="5000" />    
    6.             <property  name="httpConnectionManager">//控制連接  
    7.                     <ref  bean="multiThreadedHttpConnectionManager" />    
    8.             </property>    
    9.         </bean>    
    10.     </property>    
    11. </bean>    
    12. <bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">    
    13.     <property name="params">    
    14.         <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">    
    15.             <property name="maxTotalConnections"  value="600" />    
    16.             <property name="defaultMaxConnectionsPerHost" value="512" />    
    17.         </bean>    
    18.     </property>    
    19. </bean>    
    httpClient的3.1版本不支持這種配置

    [html] view plain copy
    1. <property  name="connectionTimeout" value="2000" />      
    2. <property  name="timeout"  value="5000" />    

    另外httpClient本身也是多線程的。。HttpClient that uses a default MultiThreadedHttpConnectionManage
    <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">  
        <property  name="maxTotalConnections"  value="600" />  
        <property  name="defaultMaxConnectionsPerHost"  value="512" />  
    </bean>  
    maxConnectionsPerHost 每個(gè)主機(jī)的最大并行鏈接數(shù),默認(rèn)為2 
    public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2; 
    maxTotalConnections 客戶端總并行鏈接最大數(shù),默認(rèn)為20  
    public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20; 

    posted @ 2016-06-19 10:29 youngturk 閱讀(2257) | 評論 (0)編輯 收藏

    6. 分布式緩存集群環(huán)境配置 轉(zhuǎn)

         摘要: http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.htmlhttp://www.cnblogs.com/hellowood23/p/5210267.htmlhttp://blog.csdn.net/ni_hao_ya/article/details/9344779http://www.cnblogs.com/hellowood23/p/...  閱讀全文

    posted @ 2016-06-19 00:22 youngturk 閱讀(177) | 評論 (0)編輯 收藏

    手動(dòng)獲取spring的ApplicationContext和bean對象

    WEB項(xiàng)目:

    方法1:

    1
    ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

     方法2:

    1
    ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

     方法3:

    1
    寫一個(gè)工具類類繼承ApplicationObjectSupport,并將這個(gè)加入到spring的容器

     方法4:

    1
    寫一個(gè)工具類類繼承WebApplicationObjectSupport,并將這個(gè)加入到spring的容器

     方法5:(推薦)

    1
    寫一個(gè)工具類實(shí)現(xiàn)ApplicationContextAware接口,并將這個(gè)加入到spring的容器

     示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import java.util.Map;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
     
    /**
     * 獲取ApplicationContext和Object的工具類
     * @author yzl
     *
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class SpringContextUtils implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
     
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            applicationContext = arg0;
        }
     
        /**
         * 獲取applicationContext對象
         * @return
         */
        public static ApplicationContext getApplicationContext(){
            return applicationContext;
        }
         
        /**
         * 根據(jù)bean的id來查找對象
         * @param id
         * @return
         */
        public static Object getBeanById(String id){
            return applicationContext.getBean(id);
        }
         
        /**
         * 根據(jù)bean的class來查找對象
         * @param c
         * @return
         */
        public static Object getBeanByClass(Class c){
            return applicationContext.getBean(c);
        }
         
        /**
         * 根據(jù)bean的class來查找所有的對象(包括子類)
         * @param c
         * @return
         */
        public static Map getBeansByClass(Class c){
            return applicationContext.getBeansOfType(c);
        }
    }

     

     

    非WEB項(xiàng)目

    1
    ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml")

    可選的操作方法有:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    一:
    String[]   path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"};
    ApplicationContext context = new FileSystemXmlApplicationContext(path);
     
    二:
    String path="WebRoot/WEB-INF/applicationContext*.xml";
    ApplicationContext context = new FileSystemXmlApplicationContext(path);
     
    三:
    ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址");
    沒有classpath的話就是從當(dāng)前的工作目錄

    posted @ 2016-06-18 23:56 youngturk 閱讀(256) | 評論 (0)編輯 收藏

    Ehcache學(xué)習(xí) 轉(zhuǎn)

         摘要: http://ligf06.iteye.com/blog/17108875.    在 Spring 中運(yùn)用 EHCache需要使用 Spring 來實(shí)現(xiàn)一個(gè) Cache 簡單的解決方案,具體需求如下:使用任意一個(gè)現(xiàn)有開源 Cache Framework,要求使用 Cache 系統(tǒng)中 Service 或則 DAO 層的...  閱讀全文

    posted @ 2016-06-18 15:45 youngturk 閱讀(147) | 評論 (0)編輯 收藏

    僅列出標(biāo)題
    共33頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結(jié)構(gòu)
    4 口語英語

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學(xué)習(xí)

    Flex學(xué)習(xí)

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 另类免费视频一区二区在线观看| 成人免费毛片内射美女-百度| 国产成人无码a区在线观看视频免费| 亚洲国产综合91精品麻豆| 美女免费视频一区二区| 成年黄网站色大免费全看| 一本久久a久久精品亚洲| 亚洲av无一区二区三区| 成人福利免费视频| 亚洲AV无码1区2区久久| 一区二区三区免费视频观看 | 波多野结衣中文一区二区免费 | 学生妹亚洲一区二区| 国产成人一区二区三区视频免费| 亚洲AV无码乱码在线观看| 中文字幕亚洲综合久久综合 | 精品亚洲成a人片在线观看| 岛国岛国免费V片在线观看| 国产特级淫片免费看| 亚洲欧洲日本在线观看| 最近新韩国日本免费观看| 亚洲AV无码一区二区二三区入口 | 妇女自拍偷自拍亚洲精品| 免费阿v网站在线观看g| 亚洲A∨无码一区二区三区| 成人毛片100免费观看| 亚洲精品网站在线观看不卡无广告| 亚洲欧洲国产综合AV无码久久| 午夜免费1000部| 亚洲日韩区在线电影| 国产成人无码区免费内射一片色欲| 亚洲福利视频一区二区| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 国产午夜亚洲精品不卡| 处破痛哭A√18成年片免费| 亚洲一级片在线播放| 国产成人精品免费视频动漫| 亚洲尹人香蕉网在线视颅| 久久成人无码国产免费播放| 亚洲AV无码久久精品狠狠爱浪潮| 99re6在线视频精品免费|