Page 1 of 1

Using HttpClient

PostPosted: Thu Jun 01, 2023 8:08 am
by rieder
Hi

How should the http client be used? We try to call PUT Requests and notice problems after a while. The Server does not receive the calls, they hang. Or we see and error in the log, saying "Socket closed".
  • We have no timeout defined.
  • We use asynchronous calls.
  • We create the http client once and reuse it. Is there a state we can check?
  • We create a new put request for each call.
  • We have two methods, which call put requests. We use the same success handlers and error handlers for both.
Can anyone point us to the right usage of the http client?

Thank you and kind regards
Birgit

Re: Using HttpClient

PostPosted: Thu Jun 01, 2023 9:32 am
by robert.edelmann
We use the http-client mostly for GET-Requests, but we always close the client as soon as possible, mainly to avoid problems with thread-/ memory-usage, we used to have a loop that opened many clients, which after an update to 2022.09 basically brought the our server to its limits.

So it's basically open client - request - get data / status - close.

But i'm interested how other people do this, perhaps there's an more efficient way.

Re: Using HttpClient

PostPosted: Thu Jun 01, 2023 11:28 am
by jcompagner
you can reuse 1 http client just fine
If you know a servoy client needs an http client frequently you can cache it and use it
Dont' start constant clients that you don't close that is a big nogo.


if there is never a success or error callback method called, then for some reason the server doesn't respond (but does accept the request)
So not sure what happens at the caller side? are success and error never called?

there are limits how many request the http plugin does at 1 time at the same time.
see for example:

var config = plugins.http.createNewHttpClientConfig();
config.maxIOThreadCount = 5;

also with http://httpbin.org/#/Anything you can test stuff

Re: Using HttpClient

PostPosted: Thu Jun 01, 2023 4:17 pm
by rieder
Thank you, Robert and Johan

With your answers I could (as far as I can tell so far) get it to work stable.
  • As you, Johan, mentioned: Creating a client each time does not work.
  • Closing the client in a callback method is a problem, since we use async calls. There might be an other request pending.
  • For different functions I now use different clients. And I cache them to reuse them.
  • Btw: maxIOThreadCount is not (no more?) an attribute of the Http Client Config. I use a counter now, and close the client after 5 calls and create a new one.

All the debugging is tricky :-( and takes a lot of time.
Any better idea for the implementation is still very welcome.

Thanks again and best regards
Birgit

Re: Using HttpClient

PostPosted: Thu Jun 01, 2023 6:57 pm
by rieder
Hi

We now made a stress test, simulating teachers entering marks for their classes. We recalculate promotion values (http call) after each change of a mark. The current implementation is much more stable than before. But raises errors after about 25 calls. See the error below.

Can anyone tell from the error: Is this related to the client? Or has the server an error handling all the calls?

Thank you and kind regards
Birgit


ERROR com.servoy.j2db.util.Debug - Error executing a request to http://10.211.55.3:8183/servoy-service/ ... lePosition with method PUT with user: null, workstation: null, domain: null org.apache.http.impl.execchain.RequestAbortedException: Request execution failed
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:199) ~[?:?]
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[?:?]
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[?:?]
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) ~[?:?]
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[?:?]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[?:?]
at com.servoy.extensions.plugins.http.BaseRequest.executeRequest(BaseRequest.java:239) ~[?:?]
at com.servoy.extensions.plugins.http.BaseRequest.access$000(BaseRequest.java:52) ~[?:?]
at com.servoy.extensions.plugins.http.BaseRequest$1.run(BaseRequest.java:392) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
at java.lang.Thread.run(Unknown Source) ~[?:?]
Caused by: java.util.concurrent.CancellationException: Operation aborted
at org.apache.http.pool.AbstractConnPool.operationAborted(AbstractConnPool.java:182) ~[?:?]
at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:397) ~[?:?]
at org.apache.http.pool.AbstractConnPool.access$300(AbstractConnPool.java:70) ~[?:?]
at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:253) ~[?:?]
at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:198) ~[?:?]
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:306) ~[?:?]
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:282) ~[?:?]
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190) ~[?:?]