It's not a big issue for us right now ... but when we start using HttpClient more heavily it'll become important. Just throwing the idea out there for now in case anyone else wants to do the patch. :)

Thanks,
 Sam

On Thursday, April 8, 2004, at 03:34 PM, Oleg Kalnichevski wrote:

It's on my virtual 'to-do' list (along with many other things [Sigh]).
Feel free to file a bug report and attach a patch against CVS HEAD,
though.

Oleg

On Thu, 2004-04-08 at 21:29, Sam Berlin wrote:
Regarding point 4, it might be worthwhile to use reflection on newer
JVMs so that the controller thread isn't necessary. An example of this
is:


//a) Conceptually, this code does the following:
// SocketAddress addr=new InetSocketAddress(host,
port);
// Socket ret=new Socket();
// ret.connect(addr, timeout);
// return ret;
// Unfortunately that causes compile errors on older
versions
// of Java. Worse, it may cause runtime errors if class
loading
// is not done lazily. (See chapter 12.3.4 of the Java
Language
// Specification.) So we use reflection.
Class _socketClass = Class.forName("java.net.Socket");
Class _socketAddressClass = Class.forName("java.net.SocketAddress");
Class _connectMethod = _socketClass.getMethod("connect",
new Class[] { _socketAddressClass, Integer.TYPE });
Class socketAddress =
Class.forName("java.net.InetSocketAddress");
Class _inetAddressConstructor =
socketAddress.getConstructor(new Class[] {
String.class, Integer.TYPE
});
try {
Socket ret = (Socket)_socketClass.newInstance();


                                Object addr = _inetAddressConstructor.newInstance(
                     new Object[] { host, new Integer(port) });

                 _connectMethod.invoke(ret,
                     new Object[] { addr, new Integer(timeout) });
                 return ret;
             } catch (InvocationTargetException e) {
                 Throwable e2 = e.getTargetException();
                 throw (IOException)e2;
             } catch(InstantiationException e) {
             } catch(IllegalAccessException e) {
             }

Thanks,
  Sam


On Thursday, April 8, 2004, at 03:22 PM, Oleg Kalnichevski wrote:


Gil,
(1) First and foremost DO reuse HttpClient instances when using
multi-threaded connection manager. HttpClient class is thread-safe. In
fact there are no known problems with having just one instance of
HttpClient per application. Using a new instance of HttpClient for
processing each request totally defeats all the performance
optimizations we have built into HttpClient


(2) Use multi-threaded connection manager in case you do not

(3) Disable stale connection check

(4) Do not use connect timeout which causes a controller thread to be
spawned per connection attempt

Oleg

On Thu, 2004-04-08 at 21:02, Alvarez, Gil wrote:
We recently ported our url-hitting code from using java.net.* code to
httpclient code. We use it in a high-volume environment (20 machines
are
hitting an external 3rd party to retrieve images).






After the port, we saw a significant increase in cycles used by the
machines, about 2-3 times (ie, the load on the boxes increased from
using up 20% of the cpu, to about 50%-60% of the cpu.



For each request, we instantiate an HttpClient object, and a GetMethod
object, and shut things down afterwards.




In order to reduce the use of cycles, what is the recommended
approach?



Thank you.



---------------------------------------------------------------------
To unsubscribe, e-mail:
[EMAIL PROTECTED]
For additional commands, e-mail:
[EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to