当前位置: 首页 > 面试题库 >

在多线程环境中重用JAX RS Client(轻松自在)

狄溪叠
2023-03-14
问题内容

根据文档,

“客户端是管理客户端通信基础结构的重量级对象。初始化和处理客户端实例可能是一项相当昂贵的操作。因此,建议在应用程序中仅构造少量的客户端实例。”

好的,我试图将客户端本身和WebTarget实例缓存在一个静态变量中,在多线程环境中调用someMethod():

private static Client client = ClientBuilder.newClient();
private static WebTarget webTarget = client.target("someBaseUrl");
...
public static String someMethod(String arg1, String arg2)
{
    WebTarget target = entrTarget.queryParam("arg1", arg1).queryParam("arg2", arg2);
    Response response = target.request().get();
    final String result = response.readEntity(String.class);
    response.close();
    return result;
}

但是有时(并非总是)我会例外:

无效使用BasicClientConnManager:连接仍被分配。在分配另一个之前,请确保释放连接。

Client / WebTarget如何正确重用/缓存?JAX RS Client API是否可以?还是我必须使用某些特定于框架的功能(resteasy /
jersey),能否提供一些示例或文档?


问题答案:

您的实现不是线程安全的。当两个线程同时访问someMethod时,它们共享相同的线程,一个线程Client将尝试发出第二个请求,而第一个请求未完成。

您有两种选择:

  • 同步对Client和的访问WebTarget
  • 让容器通过注释封闭类型来管理并发性,以@javax.ejb.Singleton确保线程安全。(请参阅EJB规范的 4.8.5章)

如果someMethod在容器管理的环境中,我将使用第二种方法。



 类似资料:
  • 我有几个问题。 > 如果我连续调用getSomeData(),是否每次都为stmt和rs分配新对象? 不管上面问题的答案如何,如果我在多线程环境中运行这段代码(使用MysqlUtils类的多线程),会不会因为我没有在getSomeData()中声明ResultSet rs而出现混淆?

  • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native

  • 关于Spring WebClient我有一个问题 在我的应用程序中,我需要做许多类似的API调用,有时我需要更改调用中的头(身份验证令牌)。所以问题来了,在这两个选择中,什么更好: > 为所有传入的MyService.class请求创建一个WebClient,方法是将其设置为字段,如下代码所示: 谢谢你。

  • 问题内容: 典型的(对于x86-64平台和Linux OS)是在开始时幼稚地锁定互斥锁并在完成后将其释放,还是以更巧妙的方式将互斥锁锁定在更精细的级别,从而减少了锁争用?如果确实采用第二种方法,那么该如何做? 问题答案: 经营多个分配 场所 。每个竞技场都有自己的锁。当线程需要分配内存时,选择一个竞技场,将其锁定,然后从中分配内存。 选择竞技场的机制有些复杂,旨在减少锁争用: 考虑到这一点,基本上

  • 问题内容: 我正在开发一个项目,在该项目中,我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。 下面是我的主要代码,它使用和- 下面是我的类,它实现接口并使用… 现在我有下面的代码在另一大类它调用的方法类顺序- 所以我的问题是在这里应该是静态的,就像我正确看到的一样,我正在为每个请求重新创建整个连接池,而我猜这不是正确的方法。 注意: 如果我将RestTemp

  • 问题内容: 一段时间以来,我一直在多线程环境中使用HttpClient。对于每个线程,当它启动连接时,它将创建一个全新的HttpClient实例。 最近,我发现使用这种方法可能导致用户打开太多端口,并且大多数连接处于TIME_WAIT状态。 http://www.opensubscriber.com/message/commons-httpclient- dev@jakarta.apache.or