On Feb 13, 2008, at 3:04 PM, Mike Heath wrote:

Sangjin Lee wrote:
What I've seen with AHC is that the configuration is often the most
challenging aspect. One metaphor I used is that HttpClient is more like a browser. Things like keep-alive, user-agent, accept-encoding, etc. normally belong to the browser and not at the individual request level. I'm sure there are many delicate decisions to make that don't get solved easily by
this metaphor, but I think it's certainly useful.

This is the metaphor I would like to follow is well which is why in my
API proposal I didn't provide a mechanism for sending a raw HttpRequest
object through the HttpClient.

After reviewing all the feedback and thinking about the problem more,
I'm thinking that if the user submits a MutableHttpRequest, then the
HttpClient will modify that request as appropriate. If the HttpRequest
does not implement MutableHttpRequest, then the request will be sent
unmodified.  I think this should solve the problem adequately. WDT?

I think we should keep things crazy simple until we have a problem we need to solve. Maybe you are and I don't see it. Can you explain why we need to use HttpRequest in the HttpClient?


I've mentioned this before, but one thing I like with AHC is handling
multiple requests with a completion queue (not unlike CompletionService). This addresses a use case which is a variation of one of Mike's use cases.

Suppose you want to send requests to N URLs concurrently. You want to limit the overall duration to a certain time, and you want to place a standard error result for the URL for which the response did not get in time. This is a pretty typical situation with a "scatter-and-gather" scenario (e.g.
portal with multiple server-side content aggregation, etc.).

With a completion queue, one can do things like the following:

CompletionQueue q;
client.send(request1, q);
client.send(request2, q);
...
client.send(requestN, q);

for (int i = 0; i < N; i++) {
    Future f = q.take();
    Response r = f.get();
}

This can be done by the user in terms of a listener/callback, but it would
certainly be nice to provide support for this...  My 2 cents.

I too really like the idea of using a Queue for handling futures.  It
opens up a lot of interesting possibilities.

The problem I see is for each method in HttpClient, do we provide an
overloaded version that accepts a Queue?  This would make the API very
cluttered IMO.

We use an HttpListener to add the completed future to the queue.  See
the following example.

BlockingQueue q;
queueListener = new QueueListener(q);

client.send(request1).addListener(queueListener);
client.send(request2).addListener(queueListener);
client.send(request3).addListener(queueListener);
client.send(request4).addListener(queueListener);

for (int i = 0; i < N; i++) {
    Future f = q.take();
    HttpResponse r = f.get();
}

The problem with this approach is that with the AsyncWeb client API, as I've proposed it, there would be no way to know which request the future
object represents because we don't know the order in which each
HttpListener will be invoked.

I'm not sure how we keep track of requests in Sangjin's proposal either. If we can't, then your solution is an elegant equivalent.


Regards,
Alan


Reply via email to