Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The async http client is to be used in conjunction with web containers that are configured for non blocking communication. CometProcesor with Tomcat and Continuation with Jetty are some good examples. This example uses Tomcat.

This document is organized in the following sections:

Table of Contents

About this example

...

  1. Stop the server.
  2. edit geronimo_home/var/config/config.xml
  3. add load="false" to the TomcatWebConnector gbean. The line would now look like this code
    <gbean load="false" name="TomcatWebConnector">
  1. for the module org.apache.geronimo.configs/tomcat6/<version>/car, add the following gbean
    Code Block
    XML
    XML
    borderStylesolid
    <gbean gbeanInfo="org.apache.geronimo.tomcat.connector.Http11NIOConnectorGBean" 
           name="org.apache.geronimo.configs/tomcat6/2.0.1/car?ServiceModule=org.apache.geronimo.configs/tomcat6/2.0.1/car,j2eeType=GBean,name=TomcatNIOConnector">
    <attribute name="useExecutor">true</attribute>
    <attribute name="maxThreads">40</attribute>
    <attribute name="pollerThreadCount">1</attribute>
    <attribute name="socket_soTimeout">5000</attribute>
    <attribute name="selectorTimeout">1000</attribute>
    <attribute name="connectionTimeout">60000</attribute>
    <attribute name="socket_soLingerOn">true</attribute>
    <attribute name="acceptorThreadCount">1</attribute>
    <attribute name="port">8080</attribute>
    <attribute name="pollerThreadPriority">5</attribute>
    <attribute name="compressableMimeType">text/html,text/xml,text/plain</attribute>
    <attribute name="socket_performanceLatency">0</attribute>
    <attribute name="useComet">true</attribute>
    <attribute name="useIPVHosts">false</attribute>
    <attribute name="maxHttpHeaderSize">4096</attribute>
    <attribute name="restrictedUserAgents" value=""/>
    <attribute name="acceptorThreadPriority">5</attribute>
    <attribute name="proxyPort">0</attribute>
    <attribute name="maxPostSize">2097152</attribute>
    <attribute name="minSpareThreads">10</attribute>
    <attribute name="socketBuffer">9000</attribute>
    <attribute name="redirectPort">8443</attribute>
    <attribute name="bufferSize">2048</attribute>
    <attribute name="socket_soReuseAddress">false</attribute>
    <attribute name="useSendfile">true</attribute>
    <attribute name="threadPriority">5</attribute>
    <attribute name="socket_tcpNoDelay">false</attribute>
    <attribute name="useBodyEncodingForURI">false</attribute>
    <attribute name="maxSpareThreads">100</attribute>
    <attribute name="enableLookups">true</attribute>
    <attribute name="socket_performanceConnectionTime">1</attribute>
    <attribute name="socket_appWriteBufSize">8192</attribute>
    <attribute name="maxKeepAliveRequests">100</attribute>
    <attribute name="socket_ooBInline">true</attribute>
    <attribute name="socket_keyCache">500</attribute>
    <attribute name="disableUploadTimeout">true</attribute>
    <attribute name="socket_bufferPoolSize">104857600</attribute>
    <attribute name="keepAliveTimeout">60000</attribute>
    <attribute name="acceptCount">100</attribute>
    <attribute name="socket_txBufSize">43800</attribute>
    <attribute name="connectionLinger">-1</attribute>
    <attribute name="command_line_options">true</attribute>
    <attribute name="tcpNoDelay">true</attribute>
    <attribute name="oomParachute">1048576</attribute>
    <attribute name="socket_appReadBufSize">8192</attribute>
    <attribute name="selectorPool_maxSpareSelectors">-1</attribute>
    <attribute name="xpoweredBy">false</attribute>
    <attribute name="socket_rxBufSize">25188</attribute>
    <attribute name="maxSavePostSize">4096</attribute>
    <attribute name="socket_soLingerTime">25</attribute>
    <attribute name="compression">off</attribute>
    <attribute name="host">0.0.0.0</attribute>
    <attribute name="socket_eventCache">500</attribute>
    <attribute name="socket_performanceBandwidth">1</attribute>
    <attribute name="noCompressionUserAgents" value=""/>
    <attribute name="name">TomcatNIOConnector</attribute>
    <attribute name="socket_soKeepAlive">false</attribute>
    <attribute name="socket_soTrafficClass">28</attribute>
    <attribute name="socket_directBuffer">false</attribute>
    <attribute name="selectorPool_maxSelectors">200</attribute>
    <attribute name="emptySessionPath">false</attribute>
    <attribute name="uriEncoding">ISO-8859-1</attribute>
    <attribute name="allowTrace">false</attribute>
    <attribute name="processCache">200</attribute>
    <attribute name="socket_processorCache">500</attribute>
    <attribute name="server" null="true"/>
    <attribute name="proxyName" null="true"/>
    <reference name="TomcatContainer">
    <pattern>
    <groupId>org.apache.geronimo.configs</groupId>
    <artifactId>tomcat6</artifactId>
    <version>2.0.1</version>
    <type>car</type>
    <name>TomcatWebContainer</name>
    </pattern>
    </reference>
    <reference name="ServerInfo">
    <pattern>
    <groupId>org.apache.geronimo.configs</groupId>
    <artifactId>j2ee-system</artifactId>
    <version>2.0.1</version>
    <type>car</type>
    <name>ServerInfo</name>
    </pattern>
    </reference>
    </gbean>
    
  2. The gbean uses version 2.0.1. Replace that with the appropriate version of your server
  3. Start the server.

...

  1. Deploy samples\async-http\http-local-app\target\http-local-app-2.0-SNAPSHOT.war on the Geronimo server we configured earlier using either the consoleor the command line code
    $geronimo_home/bin>./deploy.sh deploy _samples_\async-http\http-local-app\target\http-local-app-2.0-SNAPSHOT.war
  2. Deploy samples\async-http directory\http-remote-app\target\http-remote-app-2.0-SNAPSHOT.war on any server on the remote machine.
  3. Point your browser to http://localhost:8080/localApp/async. If you wish to override the remoteUrl set in the <init-param> of the web.xml, you may pass it as a request param (http://localhost:8080/localApp/async?remoteUrl=http://foo:8080)
  4. You should see either a dummy html or one of the popular HTTP errors.

...

  1. Download the client python script. You will need python installed on your machine to run this script. You can download Python from here.
  2. The script takes 3 arguments - the name of the machine running http-local-app (AHC), the url of the server on the remote app and the number of threads. code
    ahcrequest.py local_machine http://remote_machine:8080 Image Added 200

Test Results

The following test results show a comparison between an AHC enhanced servlet and a normal blocking servlet. Each of these servlets are pounded by 16, 200 and 500 simultaneous requests. The output captured from the python script shows the response time for each request. These tests also demonstrate the significance of tuning the IP stacks. When none of the machines are tuned, the response time starts increasing as the number of threads start increasing. Executing a netstat command shows that most sockets are either in TIME_WAIT or CLOSED_WAIT state.

...