如何配置JAX-RS客户端以便同时进行调用

时间:2018-04-11 09:48:33

标签: java http jax-rs wildfly

我的网络应用程序是通过http访问的,并使自己成为http-calls。为此,我使用jaxrs-client。由于Client被认为是一种昂贵的资源,因此它被初始化一次并在请求中重用。

Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(baseUri).path(...);

在请求期间,http呼叫如下:

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实现提供程序的一部分。

询问谷歌,有人提示建议REST-EASY或apache-httpclient(池大小或特定的HttpClientConnectionManager)的设置。 但我的应用程序不依赖于其中一个。它仅取决于javax:javaee-api:7.0

我的问题:是否有独立于供应商的方式来配置javax.ws.rs.client.Client能够同时进行呼叫?

1 个答案:

答案 0 :(得分:3)

你问题的简短回答是......没有。这是一个很长的答案:

您的代码直接依赖于javaee-api中定义的jax-rs api(接口)。您将代码部署到wildfly中,其运行时将Rest-Easy作为JAX-RS的特定实现提供。 Wildfly的依赖管理/类加载负责加载Rest-Easy的jax-rs api的具体实现。

Rest-Easy使用apache http客户端(apache-http客户端 jax-rs api的实现,Rest Easy是)作为底层http客户端。如果没有配置,apache-http客户端将以BasicClientConnManager作为默认值运行。要处理并发请求,您需要显式配置多线程连接管理器 - 有关详细信息,请参阅apache http-client文档http-client documentation - 或者如果您想要一个示例,请告诉我。