E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
          一直以來(lái),整合Apache HTTP Server和其他Java容器時(shí),可能你最好的選擇就是mod_jk,但是mod_jk在Apache和外部Java服務(wù)器之間使用socket來(lái)進(jìn)行協(xié)議轉(zhuǎn)換,性能不能盡如人意。
          正如我上一篇博客里說(shuō)的,mod_java通過(guò)在apache嵌入的JVM中直接執(zhí)行Java來(lái)響應(yīng)HTTP請(qǐng)求,當(dāng)然是要快于mod_jk的。

          但是缺點(diǎn)是,不是Servlet API(雖然實(shí)現(xiàn)Servlet API不是很難,但是工作量肯定很大的),優(yōu)點(diǎn)是,接口很清晰,很靈活,可以做到的事情也就很多。


          那么如何開(kāi)發(fā)一個(gè)基于mod_java的java handler呢?OK,假設(shè)你要在Apache里響應(yīng)所有/test/*上的請(qǐng)求.
          你要做的是:
          1)配置Apache啟用mod_java
          LoadModule java_module modules/mod_java.so

          <mod_java your_main_class>
          JVMLibrary D:\jdk6\jre\bin\server\jvm.dll
          CurDir D:\apache-tomcat-6.0.14
          ADDJVMOpt -Djava.class.path=D:\apache-tomcat-6.0.14\bin\bootstrap.jar;D:\dev\vccode\mod_java\mod_java.jar
          ADDJVMOpt -Djava.library.path=D:\apache-tomcat-6.0.14\bin
          ADDJVMOpt -Dcatalina.home=D:\apache-tomcat-6.0.14
          ADDJVMOpt -Duser.dir=D:\apache-tomcat-6.0.14
          ADDJVMParam start
          ADDJVMStopParam stop
          ADDJavaHandler javatest com.yovn.apache.modj.HelloWorld
          </mod_java>
          這里main_class是可選的,如果有,那么JVM啟動(dòng)時(shí)自動(dòng)調(diào)用main方法。

          2)在配置文件里加入你將要開(kāi)發(fā)的Java Handler
          想上面文件中的
          ADDJavaHandler javatest com.yovn.apache.modj.HelloWorld
          這里 javatest是handler名字,后面是你的實(shí)現(xiàn)的class
          3)在配置文件里告訴Apache 你的handler名字對(duì)應(yīng)的路徑
          <Location /test>
              SetHandler javatest
          </Location>

          完成這些配置動(dòng)作后,apache在收到到/test/*的請(qǐng)求后mod_java會(huì)call你的handler class的processRequest方法了。

          RequestHandler接口如下定義,你的Handler都需要實(shí)現(xiàn)該接口:
          package com.yovn.apache.modj;

          import java.io.IOException;

          /**
           * 
          @author yovn
           * 
           
          */
          public  interface RequestHandler {

              
          public abstract void processRequest(ModJRequest request) throws IOException,
                      ModJavaException;

          }

          正如你看到的很簡(jiǎn)單的接口,但是ModJRequest就不簡(jiǎn)單了,該接口代表你跟Apache通行的直接的接口,目前定義如下:

          package com.yovn.apache.modj;

          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.nio.ByteBuffer;

          /**
           * 
          @author yovn
           *
           
          */
          public interface ModJRequest {
              
              
          /**
               * 
               * 
          @param name
               * 
          @return the request header value of that name
               
          */
              String getRequestHeader(String name);
              
              
          /**
               * 
               * 
          @return similar as HttpServletRequest.getRequestURI()
               
          */
              String getRequestURI();
              
          /**
               * 
               * 
          @param name header name
               * 
          @param value header value
               
          */
              
          void setResponseHeader(String name,String value);
              
              
          /**
               * 
               * 
          @param type 'text/html' etc.. 
               
          */
              
          void setContentType(String type);
              
              
          /**
               * 
               * 
          @param code response code
               
          */
              
          void setResponseCode(int code);
              
              
          /**
               * 
               * 
          @return HTTP method
               
          */
              String getMethod();
              
              
              
          /**
               * Give you the  chance when you need push datas to client
               * Also,you can use it to close a connection 
               * Note:
               * HTTP Server may close the connection when it timeout automatically.
               * When you pass use an invalid connection id to call some function , it will failed.
               * 
          @see com.yovn.apache.modj.ApacheModule#flushConnection(long, byte[], int, int)
               * 
          @see com.yovn.apache.modj.ApacheModule#closeConnection(long)
               * 
          @return the connection id for this request.
               
          */
              
          long getConnectionId();
              
              
          /**
               * same as HttpServletRequest.getServletInputStream
               * 
          @return 
               
          */
              InputStream getRequestInputStream();
              
              
          /**
               * same as HttpServletResponse.getServletOutputStream
               * 
          @return
               
          */
              OutputStream getResponseOutputStream();
              
              
              
          /**
               * You should not call the {
          @link #getRequestInputStream()} before you call this method this method.
               * In other words, You should either use this method or {
          @link #getRequestInputStream()}  to do read data from clients
               * 
          @return the direct byte buffer from native side
               * 
          @throws IOException
               
          */
              ByteBuffer readTotalRequestBody()
          throws IOException;
              
              
              
          /**
               * Use apache's apr_send_fd to send a file.
               * Before send file, you may need setup proper HTTP headers, such as 'Content-Disposition' 
               * 
          @param fileName
               * 
          @return 
               * 
          @throws IOException
               
          */
              
          boolean sendFile(String fileName)throws IOException;

          }
          如你所看,基本可以做任何事情(如果還有你想要而沒(méi)有請(qǐng)一定要告訴我哦)!

          下面給個(gè)發(fā)送文件的例子:

          /**
           * 
           
          */
          package com.yovn.apache.modj;

          import java.io.File;
          import java.io.IOException;

          /**
           * 
          @author yovn
           *
           
          */
          public class HelloWorld implements RequestHandler {

              
          /**
               * 
               
          */
              
          public HelloWorld() {
                  
          // TODO Auto-generated constructor stub
              }

              
          /*
               * (non-Javadoc)
               * 
               * @see com.yovn.apache.modj.RequestHandler#processRequest(ModJRequest request)
               
          */

              
          public void processRequest(ModJRequest request) throws IOException,
                      ModJavaException {

                  request.setContentType(
          "APPLICATION/OCTET-STREAM");
              

                  File f
          =new File("D:\\cspace\\mod_java\\release\\ddd.bin");
                  request.setResponseHeader(
          "Content-Disposition""attachment;filename=\"ddd.bin\"");
                  request.setResponseHeader(
          "Content-Length",f.length()+"");
                  
                  request.sendFile(f.getCanonicalPath());
                  

              }

          }

          下載:
          mod_java_0.1

          posted on 2008-06-19 15:38 DoubleH 閱讀(4712) 評(píng)論(5)  編輯  收藏

          Feedback

          # re: 告別mod_jk,轉(zhuǎn)向Apache Java Module(mod_java) 2008-06-19 17:34 po
          先學(xué)習(xí)學(xué)習(xí)。觀摩觀摩。  回復(fù)  更多評(píng)論
            

          # re: 告別mod_jk,轉(zhuǎn)向Apache Java Module(mod_java) 2008-06-19 21:24 隔葉黃鶯
          通過(guò) JVMLibrary D:\jdk6\jre\bin\server\jvm.dll
          這種配置,看得出來(lái) mod_java 能在 Apache 中把 Tomcat 作為一個(gè)子模塊來(lái)啟動(dòng),Apache 和 Tomcat 在同一個(gè)進(jìn)程中,避免了 mod_jk 那樣的 Apache 和 Tomcat 通過(guò)端口轉(zhuǎn)發(fā)的進(jìn)程間通信。  回復(fù)  更多評(píng)論
            

          # re: 告別mod_jk,轉(zhuǎn)向Apache Java Module(mod_java) 2008-06-20 10:04 demo
          請(qǐng)這種情況下如何做到負(fù)載均衡和集群技術(shù)實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
            

          # re: 告別mod_jk,轉(zhuǎn)向Apache Java Module(mod_java) 2008-06-20 12:35 DoubleH
          @demo
          如果直接在Apache里能獲得更好的性能,為什么不直接Apache集群?  回復(fù)  更多評(píng)論
            

          # re: 告別mod_jk,轉(zhuǎn)向Apache Java Module(mod_java)[未登錄](méi) 2008-12-26 13:48 過(guò)客
          如果使用現(xiàn)成框架:JSF
          應(yīng)該如何使用mod_java???????  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 临颍县| 奉新县| 泰来县| 眉山市| 即墨市| SHOW| 陆丰市| 房山区| 乐陵市| 女性| 即墨市| 长春市| 宁阳县| 赣州市| 瓦房店市| 三门县| 图们市| 绥滨县| 顺义区| 安多县| 东源县| 无为县| 饶阳县| 正定县| 石首市| 东光县| 四川省| 晋中市| 宾阳县| 子洲县| 台州市| 光山县| 泾川县| 浦东新区| 静宁县| 军事| 襄汾县| 承德县| 新巴尔虎左旗| 墨玉县| 当涂县|