APR为JBoss AS加速:实现分析

原创 2007年10月05日 17:48:00
  •  
APR为JBoss加速主要通过基于APR和JNI(Java Native Interface)的Connector实现。具体包括:Connector、JNI和集成。
Connector
1、 基于APR的HTTP11 Connector实现
org.apache.coyote.http11. Http11NioProcessor
org.apache.coyote.http11. Http11AprProtocol
2、 基于APR的AJP Connector实现
org.apache.coyote.ajp. AjpAprProcessor
org.apache.coyote.ajp. AjpAprProtocol
JNI实现
1、 Connector
Java接口:org.apache.tomcat.jni.Library
C实现:native connector的src目录
2、 SSL
Java接口:org.apache.tomcat.jni.SSL
C实现:native connector的src目录
 
APR集成
1、 JNI库的初始化和清除
APR的初始化通过Server的LifecycleListener接口实现,配置在server.xml中,xml片断如下:
<Server>
 
 <!--APR library loader. Documentation at /docs/apr.html -->
 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
……
 
JNI库在Server的Lifecycle的INI_EVENT时进行初始化,在AFTER­_STOP_EVENT时进行清除,具体代码如下:
 
/**
     * Primary entry point for startup and shutdown events.
     *
     * @param event The event that has occurred
     */
    public void lifecycleEvent(LifecycleEvent event) {
 
        if (Lifecycle.INIT_EVENT.equals(event.getType())) {
            aprInitialized = init();
            if (aprInitialized) {
                try {
                    initializeSSL();
                } catch (Throwable t) {
                    if (!log.isDebugEnabled()) {
                        log.info(sm.getString("aprListener.sslInit"));
                    } else {
                        log.debug(sm.getString("aprListener.sslInit"));
                    }
                }
            }
        } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
            if (!aprInitialized) {
                return;
            }
            try {
                terminateAPR();
            } catch (Throwable t) {
                if (!log.isDebugEnabled()) {
                    log.info(sm.getString("aprListener.aprDestroy"));
                } else {
                    log.debug(sm.getString("aprListener.aprDestroy"), t);
                }
            }
        }
 
    }
 
 
2、 Connector选用
 
public Connector(String protocol)
        throws Exception {
        setProtocol(protocol);
        // Instantiate protocol handler
        try {
            Class clazz = Class.forName(protocolHandlerClassName);
            this.protocolHandler = (ProtocolHandler) clazz.newInstance();
        } catch (Exception e) {
            log.error
                (sm.getString
                 ("coyoteConnector.protocolHandlerInstantiationFailed", e));
        }
    }
 
 
    /**
     * Set the Coyote protocol which will be used by the connector.
     *
     * @param protocol The Coyote protocol name
     */
    public void setProtocol(String protocol) {
 
        // Test APR support
        initializeAPR();
 
        if (aprInitialized) {
            if ("HTTP/1.1".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11AprProtocol");
            } else if ("AJP/1.3".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.ajp.AjpAprProtocol");
            } else if (protocol != null) {
                setProtocolHandlerClassName(protocol);
            } else {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11AprProtocol");
            }
        } else {
            if ("HTTP/1.1".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11Protocol");
            } else if ("AJP/1.3".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.jk.server.JkCoyoteHandler");
            } else if (protocol != null) {
                setProtocolHandlerClassName(protocol);
            }
        }
 
    }
 
说明:Connector构造函数调用setProtocol函数设置Connector处理请求的Protocol Handler。在setProtocol函数中,只要能够成功地初始化APR,将使用基于APR的实现的org.apache.coyote.http11.Http11AprProtocol和org.apache.coyote.ajp.AjpAprProtocol作为请求处理的Protocol Handler。

APR为JBoss AS加速:介绍

 APR的全称为Apache Portable Runtime,出自名门Apache。说到APR就要从大名鼎鼎的Apache Http 服务器说起,在Apache Http服务器早期版本的开发中,为了...
  • JBossWeek
  • JBossWeek
  • 2007年09月13日 23:25
  • 956

APR为JBoss AS加速:安装

 套装的JBoss AS 4.2是一个100%纯Java的应用服务器,没有提供APR的支持。Web容器使用的是嵌入的Tomcat6,Http处理使用java处理。缺省情况下当启动JBoss AS时,会...
  • JBossWeek
  • JBossWeek
  • 2007年09月14日 23:42
  • 1539

APR为JBoss AS加速:HTTP Connector配置

 HTTP connector使用sendfile处理大的静态文件(所有这些大文件都使用高性能的内核级调用通过异步方式发送),使用socket poller实现keepalive,提升服务器的扩展性。...
  • JBossWeek
  • JBossWeek
  • 2007年09月29日 21:48
  • 3271

APR为JBoss AS加速:AJP Connector配置

 AJP connector使用socket poller实现keepalive,增加了服务器的扩展性。因为AJP以持久(或者近似持久)连接为中心进行设计,所以能够极大地减少JBoss Web所需的处...
  • JBossWeek
  • JBossWeek
  • 2007年10月02日 20:53
  • 2344

APR为JBoss AS加速:HTTPS Connector配置

 当启用APR时,HTTPS connector将使用socket poller实现keepalive,增加服务器的扩展性。它还使用OpenSSL,这比使用依赖处理器的JSSE更能优化服务器的性能,并...
  • JBossWeek
  • JBossWeek
  • 2007年10月01日 20:40
  • 1807

APR分析-整体篇 http://blog.csdn.net/jmshl/article/details/6773731

APR分析-整体篇 由于部门所使用的底层库与Apache Server有着“一定的渊源”,所以总有一种想看看Apache的实现的冲动。最近项目收尾,愿望终可实现。   一、何为APR...
  • wangyin159
  • wangyin159
  • 2015年09月07日 21:15
  • 1405

初探android应用性能分析

原文地址: http://blog.gaoyuan.xyz/2013/11/22/android-app-profile-tools/ 如果一个android应用打开时比较慢,或者使用起来比较卡...
  • maspchen
  • maspchen
  • 2016年01月28日 08:52
  • 313

JBoss JTA的使用心得

       前些日子,农总行的客户有个需求,需要跨Sybase ASE和Sybase IQ两个数据库操作,并且保证事务的完整性,而且客户不希望通过数据库层来保证事务,只希望在代码层控制。      ...
  • james999
  • james999
  • 2006年09月25日 16:58
  • 11378

tomcat使用APR后性能竟然毫无提升

tomcat使用APR后性能竟然毫无提升!BIO、NIO、APR三个的性能竟然相差无几,每秒处理大约250。特别是apr,我都检查过了,配置正确,启动也没报错。看到网上说apr能提升50%的性能,我这...
  • keketrtr
  • keketrtr
  • 2016年01月05日 15:55
  • 1235

Tomcat三种运行模式(BIO, NIO, APR)

Tomcat三种运行模式(BIO, NIO, APR)**Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用 的服务器之一。不过,许多开发人员不知道的是,Tomcat Conn...
  • u012088399
  • u012088399
  • 2017年07月10日 15:23
  • 447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:APR为JBoss AS加速:实现分析
举报原因:
原因补充:

(最多只允许输入30个字)