On 2010-08-30 13:32, Oleg Kalnichevski wrote:
> On Mon, 2010-08-30 at 12:20 +0200, Michel Onoff wrote:
>> On 2010-08-30 12:10, Oleg Kalnichevski wrote:
>>> On Mon, 2010-08-30 at 11:02 +0200, Michel Onoff wrote:
>>>> I read that HttpConnection is *not* thread-safe.
>>>>
>>>> While this may seem a minor detail, it makes programming with the
>>>> blocking model enormously more complex.
>>>>
>>>> For example, I'm trying to write a simple http load balancer which
>>>> forwards client requests to the next available server from a pool in one
>>>> direction, and forwards replies from servers to the originating clients
>>>> in the opposite direction.
>>>>
>>>> The idea is to have a task from java.util.concurrent assigned to each
>>>> client-side connection and a task for each server-side connection.
>>>>
>>>> The client-side task blocks on HttpConnection waiting for the next
>>>> request, forwards the request to a server-side HttpConnection and
>>>> repeats the iteration by blocking for the next request.
>>>>
>>>> The server-side task blocks waiting for the next response, forwards the
>>>> response to the appropriate originating client-side connection and
>>>> starts over again waiting for the next response.
>>>>
>>>> However, since HttpConnection is not thread-safe and since tasks are
>>>> executed in independent threads, the above schema does not work safely.
>>>> If only one thread is allowed per HttpConnection, the client-side one
>>>> that blocks for reading a request cannot forward any response on behalf
>>>> of the server-side task. Similarly the server-side thread cannot forward
>>>> a request on behalf of the client-side when it blocks reading the next
>>>> response.
>>>>
>>>
>>> One needs to differentiate concepts of thread safety and thread
>>> synchronization. It is ultra-trivial to make HttpConnection thread-safe.
>>> It will not, however, relieve you from having to synchronize access to
>>> connection instances if used by multiple collaborating threads to
>>> execute logically separate units of work (transactions). This kind of
>>> synchronization logic should not be built into the HttpConnection
>>> implementation classes, as it would violate the concept of separation of
>>> concerns. In most cases one should be using a specifically designed
>>> mechanism to manage connections tailored for a particular problem
>>> domain. For example, HttpClient provides a connection management API
>>> that can be used to ensure that only one execution thread can have
>>> access to a connection instance at a time. This makes vulgar
>>> synchronization on class methods unnecessary, as it basically does not
>>> solve any real problem.
>>>
>>> Generally the recommended strategy is to ensure that HttpConnection
>>> instance can be used by one thread a at time. One can employ different
>>> strategies based on the particular problem domain. 
>>>
>>>> I don't know of a simple workaround.
>>>>
>>>
>>> There are no simple work-arounds to complex problems.
>>>
>>
>> One ultra-simple solution would be to permit two thread to
>> simultaneously access the HttpConnection, one for reading, the other for
>> writing. (Just to make an analogy, SocketChannel allows such behavior).
>> Of course, I don't know how simply this would be to implement on the
>> current HttpCore.
>>
> 
> If that makes sense in the context of your application, go for it.
> ReadWriteLock is available in the j.u.concurrent package. All you have
> to do is to extend the default HttpConnection implementations, override
> public methods and make them acquire either read or write lock prior to
> calling the super method. 
> 
> HttpCore (and HttpClient) are toolkits, not applications. One must be
> prepared to do certain customizations in order to optimize them for a
> particular use scenario.
> 

OK, I'll take a look on how to make extensions.

Thanks

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to