Hi Sanjay, I can confirm that Client instances have been designed to be reused concurrently by several threads. The code should be thread-safe (I've just fixed the issue Tim noticed). But, nothing prevents you from having several instances of them if that makes sense, for example for configuration purpose as pointed out by Stephan Koops. In your code snippet, what is missing is a call to c.stop() to make sure that your connector is stopped and any resource used is freed. You could also explicitly do a c.start() by this is done implicitly when the requests is handled. Best regards, Jérôme Louvel -- Restlet ~ Founder and Lead developer ~ <http://www.restlet.org/> http://www.restlet.org Noelios Technologies ~ Co-founder ~ <http://www.noelios.com/> http://www.noelios.com
_____ De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] De la part de Tim Peierls Envoyé : jeudi 16 octobre 2008 04:55 À : [email protected] Objet : Re: Assistance and Question I think Client is intended to be thread-safe, but it isn't currently, because the connectTimeout field is not guarded by a lock (nor is it volatile) -- sorry Jerome, I just noticed this. This is not likely to cause any problems, but it *is* wrong. And there may be other concurrency issues lurking in Client. My feeling is better safe than sorry. If you really need to have multiple threads talking to a Client instance -- and it's not clear to me that you do -- use a ThreadLocal<Client>. It might be unnecessary, but it limits the number of open file handles to some small factor of the number of threads talking to Clients simultaneously. --tim On Wed, Oct 15, 2008 at 10:14 PM, Sanjay Acharya <[EMAIL PROTECTED]> wrote: Hi Jerome, I believe I have found the cause of our problem. We use Restlet Client by instantiating it every time, for example, for (int i = 0; i < 10000000; i++) { Client c = new Client(); .... Response response = c.handle(request); response.release(); } we end up creating a downstream HttpClient on every client. When release() is called, the socket connection is released back to the HttpConnectionManager. HttpConnectionManager does not close the socket. However, due to garbage collection, at some point the underlying socket is closed out. It happens some times and not others, i.e., via the luck of GC running. If we however, hold a Reference of every client that is instantiated, then we can easily reproduce the open file handle issue as GC will not free the underlying socket and we can see eventually reach a point where all the available file handles are consumed. That said, the direction of preference seems to point to using a single instance of Restlet's Client class and setting the "maxConnectionsPerHost" to some appropriate value. One concern that I have is whether Restlet's Client is designed to be thread safe so that multiple threads can utilize the same instance? In other words, is singleton usage the recommended pattern for using the client? Thanks much, Sanjay _____ > From: [EMAIL PROTECTED] > To: [email protected] > Date: Wed, 15 Oct 2008 08:46:06 +0200 > Subject: RE: Assistance and Question > > > Hi Sanjay, > > As a first step, I would highly recommend moving to 1.1 RC2 or a more recent > snapshot. There is a good chance that it will fix your issue. > > If not, we'll investigate more. > > Best regards, > Jérôme Louvel > -- > Restlet ~ Founder and Lead developer ~ http://www.restlet.org > Noelios Technologies ~ Co-founder ~ http://www.noelios.com > > > -----Message d'origine----- > De : Sanjay Acharya [mailto:[EMAIL PROTECTED] > Envoyé : mercredi 15 octobre 2008 02:39 > À : [email protected] > Objet : Assistance and Question > > > Hi, > > I am using Restlet version 1.1 m1. There are times when we run out of open > file handles in stage environment with "too many open file handles" error. I > am also using the JaxbRepresentation to marshall the data. > I am trying to recreate the issue related to > http://restlet.tigris.org/issues/show_bug.cgi?id=439 and not sure how to do > the same. I would like to be able to recreate a state where connections are > left in > "CLOSE_WAIT and FIN_WAIT_2 state" by the client. > > I have limited the number of open file handles to 200 for the user. > > Any assistance to be able to duplicate the issue would be great. > Thanks, > Sanjay > > Code on Resource class: > @Override public void post(Representation representation) { > > String greeting = "Hello thgere"; > > Person p = new Person(); > p.setFirstName("Foo"); > p.setLastName("Bar"); > > // A Large address list > p.setAddresses(buildAddress()); > SayHelloResponse resp = new > SayHelloResponse().withPerson(p).withGreeting(greeting); > > JaxbRepresentation responseRep = new > JaxbRepresentation(MediaType.APPLICATION_XML, resp); > > getResponse().setEntity(responseRep); > > getResponse().setStatus(Status.SUCCESS_OK); > } > > Code on Client class: > Person p = new Person().... > .... > SayHelloRequest sayHelloRequest = new SayHelloRequest().withPerson(person); > > Request restRequest = createRequest(); > request.setEntity(new JaxbRepresentation(MediaType.APPLICATION_XML, > sayHelloRequest)); > Response response = client.handle(restRequest); > response.getEntity().release(); > _________________________________________________________________ > See how Windows connects the people, information, and fun that are part of > your life. > http://clk.atdmt.com/MRT/go/msnnkwxp1020093175mrt/direct/01/= > _____ Want to do more with Windows Live? Learn "10 hidden secrets" from Jamie. Learn Now <http://windowslive.com/connect/post/jamiethomson.spaces.live.com-Blog-cns%2 1550F681DAD532637%215295.entry?ocid=TXT_TAGLM_WL_domore_092008>

