【发布时间】:2018-09-21 03:32:51
【问题描述】:
我的 webapp 是通过 http 访问的,并自己进行 http 调用。为此,我使用 jaxrs-client。由于Client 被认为是一种昂贵的资源,因此它会被初始化一次并在请求中重用。
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(baseUri).path(...);
在请求期间,http-call 是这样进行的:
Builder request = webTarget.request(MediaType.APPLICATION_JSON);
Response response = request.post(...);
try {
// evaluate response
}
finally {
response.close();
}
所以一切正常,只要 webapp 部署在 TomEE 上或没有发生并行性。 但是当代码在 Wildfly 中同时执行时,它会失败并显示
Caused by: java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
at org.apache.http.util.Asserts.check(Asserts.java:34)
at org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:162)
at org.apache.http.impl.conn.BasicClientConnectionManager$1.getConnection(BasicClientConnectionManager.java:144)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
错误是由 Wildfly 生成的,显然是使用 apache-httpclient 作为其 JAXRS 实现提供程序的一部分。
询问 google,有人会提示建议设置 REST-EASY 或 apache-httpclient(池大小或特定 HttpClientConnectionManager)。
但是我的应用程序不依赖于其中之一。它仅取决于javax:javaee-api:7.0
我的问题:是否有独立于供应商的方式来配置 javax.ws.rs.client.Client 能够同时拨打电话?
【问题讨论】: