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

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

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

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
    一直以來,整合Apache HTTP Server和其他Java容器時,可能你最好的選擇就是mod_jk,但是mod_jk在Apache和外部Java服務器之間使用socket來進行協議轉換,性能不能盡如人意。
    正如我上一篇博客里說的,mod_java通過在apache嵌入的JVM中直接執行Java來響應HTTP請求,當然是要快于mod_jk的。

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


    那么如何開發一個基于mod_java的java handler呢?OK,假設你要在Apache里響應所有/test/*上的請求.
    你要做的是:
    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啟動時自動調用main方法。

    2)在配置文件里加入你將要開發的Java Handler
    想上面文件中的
    ADDJavaHandler javatest com.yovn.apache.modj.HelloWorld
    這里 javatest是handler名字,后面是你的實現的class
    3)在配置文件里告訴Apache 你的handler名字對應的路徑
    <Location /test>
        SetHandler javatest
    </Location>

    完成這些配置動作后,apache在收到到/test/*的請求后mod_java會call你的handler class的processRequest方法了。

    RequestHandler接口如下定義,你的Handler都需要實現該接口:
    package com.yovn.apache.modj;

    import java.io.IOException;

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

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

    }

    正如你看到的很簡單的接口,但是ModJRequest就不簡單了,該接口代表你跟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;

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

    下面給個發送文件的例子:

    /**
     * 
     
    */
    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 閱讀(4710) 評論(5)  編輯  收藏

    Feedback

    # re: 告別mod_jk,轉向Apache Java Module(mod_java) 2008-06-19 17:34 po
    先學習學習。觀摩觀摩。  回復  更多評論
      

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

    # re: 告別mod_jk,轉向Apache Java Module(mod_java) 2008-06-20 10:04 demo
    請這種情況下如何做到負載均衡和集群技術實現。  回復  更多評論
      

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

    # re: 告別mod_jk,轉向Apache Java Module(mod_java)[未登錄] 2008-12-26 13:48 過客
    如果使用現成框架:JSF
    應該如何使用mod_java???????  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日韩精品视频免费在线观看| 日本片免费观看一区二区| 最近中文字幕免费mv视频7| 亚洲国产日韩在线成人蜜芽| 国产一精品一av一免费爽爽| 亚洲综合另类小说色区色噜噜| 无码AV动漫精品一区二区免费| 亚洲爽爽一区二区三区| 在线观看免费黄网站| 亚洲阿v天堂在线| 99久久综合精品免费| 亚洲日韩在线视频| 中文字幕无码成人免费视频| 亚洲性色精品一区二区在线| 免费日本黄色网址| WWW免费视频在线观看播放| 亚洲av无码国产精品夜色午夜| 久久青草精品38国产免费| 亚洲欧洲综合在线| 免费看美女让人桶尿口| 一道本在线免费视频| 亚洲AV永久无码精品| 黄页网站免费观看| 色多多A级毛片免费看| 亚洲AV无码一区二区三区DV| 18禁成人网站免费观看| 亚洲第一第二第三第四第五第六| 深夜国产福利99亚洲视频| 成人黄网站片免费视频| 亚洲色中文字幕在线播放| 中文字幕精品无码亚洲字 | 国产AV无码专区亚洲AV漫画| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲午夜无码久久| 久久久久亚洲AV成人网人人网站| 久久免费视频精品| 男人的天堂av亚洲一区2区| 亚洲AV永久无码精品水牛影视| 美女视频黄的全免费视频| 四虎影视久久久免费观看| 亚洲视频一区在线观看|