当前位置: 首页 > 知识库问答 >
问题:

RESTJava客户端API:在分配另一个连接之前释放连接

艾泰
2023-03-14

我使用以下测试代码调用REST服务:

public class TestRESTServices {
    private static final String BASE_URL = "http://localhost/ma.ge.persistence-1.0/rest/reference";
    private static URI uri = UriBuilder.fromUri(BASE_URL).port(8080).build();
    private static Client client = ClientBuilder.newClient();

    @Test
    public void createAndDeleteAReference() {

        Reference r = ReferenceFactory.createReference("Maz",
                "dummy", 1.7);
        Response response = client.target(uri).request().post(Entity.entity(r, MediaType.APPLICATION_JSON));
        assertEquals(Response.Status.CREATED, response.getStatusInfo());

        URI referenceURI = response.getLocation();

        // Get the posted reference
        response = client.target(referenceURI).request().get();

        Reference retreivedRef = response.readEntity(Reference.class);
        assertEquals(Response.Status.OK, response.getStatusInfo());
        assertEquals(retreivedRef.getName(), r.getName());

    }

但我得到了以下错误:

javax。ws。rs.ProcessingException:无法在组织上调用请求。jboss。放松点。客户jaxrs。引擎。ApacheHttpClient4引擎。在org调用(ApacheHttpClient4Engine.java:287)。jboss。放松点。客户jaxrs。内部的ClientInvocation。在org上调用(ClientInvocation.java:407)。jboss。放松点。客户jaxrs。内部的ClientInvocationBuilder。获取(ClientInvocationBuilder.java:159)在ma。格斯托。坚持不懈TestRESTServices。在sun上创建和删除引用(TestRESTServices.java:34)。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗。反思。方法在org调用(Method.java:606)。朱尼特。跑步者。模型框架方法$1。在org上运行reflectivecall(FrameworkMethod.java:47)。朱尼特。内部的跑步者。模型可反射的。在org上运行(ReflectiveCallable.java:12)。朱尼特。跑步者。模型框架方法。在org上以爆炸方式调用(FrameworkMethod.java:44)。朱尼特。内部的跑步者。声明。调用方法。在org上评估(InvokeMethod.java:17)。朱尼特。跑步者。家长跑步者。org上的runLeaf(ParentRunner.java:271)。朱尼特。跑步者。BlockJUnit4ClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:70)。朱尼特。跑步者。BlockJUnit4ClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:50)。朱尼特。跑步者。家长跑步者3美元。在org上运行(ParentRunner.java:238)。朱尼特。跑步者。家长跑步者1美元。计划(ParentRunner.java:63)位于org。朱尼特。跑步者。家长跑步者。org上的runChildren(ParentRunner.java:236)。朱尼特。跑步者。家长跑步者。访问org上的$000(ParentRunner.java:53)。朱尼特。跑步者。家长跑步者2美元。在org上评估(ParentRunner.java:229)。朱尼特。跑步者。家长跑步者。在org上运行(ParentRunner.java:309)。日食jdt。内部的junit4。跑步者JUnit4TestReference。在org上运行(JUnit4TestReference.java:50)。日食jdt。内部的朱尼特。跑步者测试执行。在org上运行(TestExecution.java:38)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:459)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:675)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行(RemoteTestRunner.java:382)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。main(RemoteTestRunner.java:192)由:java引起。lang.IllegalStateException:BasicClientConnManager的使用无效:连接仍已分配。在分配另一个连接之前,请确保释放该连接。在org。阿帕奇。http。impl。基本客户连接经理。位于org的getConnection(BasicClientConnectionManager.java:162)。阿帕奇。http。impl。康涅狄格州基本客户连接经理1美元。位于org的getConnection(BasicClientConnectionManager.java:139)。阿帕奇。http。impl。客户我是主任。在org上执行(DefaultRequestDirector.java:456)。阿帕奇。http。impl。客户抽象HttpClient。在org上执行(AbstractHttpClient.java:906)。阿帕奇。http。impl。客户抽象HttpClient。在org上执行(AbstractHttpClient.java:805)。jboss。放松点。客户jaxrs。引擎。ApacheHttpClient4引擎。调用(ApacheHttpClient4Engine.java:283)。。。26多

共有2个答案

卫开济
2023-03-14

您还需要关闭响应以释放连接。请参阅此处的说明:Resteasy客户端在方法引发异常后保持连接分配

双弘益
2023-03-14

Client接口表示外部资源。因此,在静态变量中创建和存储一个变量是一个严重的错误。这是错误的:

private static Client client = ClientBuilder.newClient();

这对于单元测试来说是可以的:

private Client client;

@Before
public void setUp() {
    this.client = ClientBuilder.newClient();
}

@After
public void tearDown() {
    this.client.close();
}

在正常的代码中,你会想要包装Client在一个try-with-Resourcestry中的用法。

Client client = ClientBuilder.newClient();
try {
    // use the client to make requests
} finally {
    client.close();
}

理想情况下,有一种方法可以管理客户机实例池以供重用。

 类似资料:
  • 问题内容: 我使用nodejs(net module )在客户端和服务器之间创建了tcp连接。服务器正在侦听已经预定义的端口,而客户端正在连接到该端口。 据我了解,客户端的端口是由节点动态分配的?那是对的吗? 哪种算法节点用于为客户端分配“随机”端口?它是如何工作的,是由节点还是由操作系统决定的? 是否可以定义将要使用哪个客户端的静态端口?是否可以定义供客户端使用的端口范围? 注意:我想我之前在找

  • 问题内容: 我有多个以太网I / F。eth0,eth1,eth2 …,我想连接到外部服务器,例如1.2.3.4:80。 我的连接没问题,但是在某些特殊情况下,我想以eth1而不是eth0的身份连接。服务器的代码检查我接口的IP地址。我认为连接之前需要绑定。没有bind(2),服务器总是从eth0获取数据包 我正在寻找演示此行为的代码。有人链接到示例吗? 问题答案: 您不需要这个。 您要在此处执行

  • 在Netty中创建客户端连接时,我有一个问题。 这里,为什么我们没有一个bind方法,将通道绑定到发起客户端连接的端口(在客户端)?我们唯一需要提供的就是给出服务器地址和端口如下: 这是在客户端还是服务器端创建了一个新的通道?此通道绑定在客户端的哪个端口? 我们在执行服务器端引导时进行绑定,如下所示 我很困惑,不明白客户端从哪个端口向服务器发送数据,使用的是什么通道?

  • 我无法获取上一个已知位置。我已经在谷歌控制台中启用了地理编码API和谷歌地点API的Android。我在清单文件中添加了 API 密钥: 但我不断在控制台中收到一条消息:“无法连接到Google API客户端:连接结果{状态代码=API_UNAVAILABLE,分辨率=空}” 更新 我使用谷歌示例 onConnected和onConnectionFailed不调用。 而且我也使用Android反应

  • 执行kafka客户端的生产者/消费者连接池有意义吗? kafka是否在内部维护已初始化并准备好使用的连接对象列表? 我们希望最小化连接创建的时间,这样在发送/接收消息时就不会有额外的开销。 目前,我们正在使用apache共享池库来保持连接。 任何帮助都将不胜感激。

  • 问题内容: 我在Redis中存储json数据列表,并使用ServiceStack c#客户端访问它。我本质上是在管理自己的外键,在其中存储id,然后使用应用程序内部的接口从中提取ID ,然后从Redis获取基础json对象并将其打包为列表以返回其他部分我的申请。 我正在使用,因为我希望Redis可以托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Wind