我正在使用 JX-RS 2.0 客户端 API 编写 REST 客户端,并将 Apache CXF 3.1.8 客户端作为类路径中的实现。
我的 gradle 依赖
compile group: 'org.apache.cxf', name: 'cxf-rt-rs-client', version: '3.1.8'
我计划只使用根 url 客户端客户端实例一次,并根据应用程序的需要使用它在运行时多次创建 WebTarget。我想重用客户端对象,因为https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Client.html这表示创建和销毁客户端对象的操作成本很高。
String baseUrl = "http://localhost:9081/rest-service/rest/";
Client client = ClientBuilder.newClient();
client.register(JacksonJsonProvider.class);
client.register(CustomObjectMapperProvider.class);
使用客户端对象创建 WebTarget
WebTarget webTarget = client.target(baseUrl + path);
我知道在封面下org.apache.cxf.jaxrs.client.WebClient
(CXF 的客户端实现)被使用了。http://cxf.apache.org/docs/jax-rs-client-api.html#JAX-RSClientAPI-ThreadSafety链接说 CXF WebClient 和 ProxyClient 默认不是线程安全的。根据此链接,我们可以在创建 CXF WebClient 或 ProxyClient 时将其设置为 true 的 threadSafe 布尔标志。
在我的代码中,我想使用标准的 JX-RS 2.0 客户端 API/接口,而不是 CXF 特定的类,如 WebClient 或 ProxyClient。
问题 -
- 如果我使用上面的代码实例化标准客户端对象,它是线程安全的吗?是否可以创建一次并多次将其用于不同资源的WebTarget?
- 列表项如果不是线程安全的,如何在我想重用客户端对象的地方实现线程安全?