2013-05-02 7 views
3

Я нашел один сценарий, когда resteasy не закрывает соединение. Есть ли способ обойти это? Я создал свой клиент, как:Клиент Resteasy, не закрывающий соединение

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(); 
HttpClient httpClient = new DefaultHttpClient(cm); 
ClientExecutor executor = new ApacheHttpClient4Executor(httpClient); 
T proxiedService = org.jboss.resteasy.client.ProxyFactory.create(clazz, base, executor); 

Я звоню следующий метод на службу

@DELETE 
@Path("{id}") 
Response deleteObject(@PathParam("id") Long id); 

И сервис возвращается

HTTP/1.1 500 Internal Server Error [Content-Length: 0, Server: Jetty(8.1.2.v20120308)] 

Любые идеи о том, что мне не хватает, чтобы подключите соединение. Примечание: для всех других типов ответов соединения закрываются.

Я знаю, что если я не верну 500, все будет хорошо работать. Но если такой сценарий случайно случится, я хочу, чтобы мой клиент мог справиться с этим, не заканчивая соединений.

ответ

2

Я предполагаю, что следующий метод принадлежит на проксируемом интерфейсе Resteasy клиента (?):

Response deleteObject(@PathParam("id") Long id); 

Если да, то проблема здесь состоит в том, что ваш метод возвращает объект Resteasy ClientResponse (что реализация Resteasy ответа jax-rs). Когда ваш метод возвращает ClientResponse, вы берете на себя ответственность за освобождение соединения.

В вашем случае вы также полагаетесь на фабрику прокси-сервера, поэтому может быть невозможно освободить соединение. В этом случае, вы должны изменить подпись вашего метода для возврата либо недействительным или тип объекта, который вы ожидаете в теле ответа HTTP:

@DELETE 
@Path("{id}") 
void deleteObject(@PathParam("id") Long id); 

или если вы ожидали, что Foo объект обратно:

@DELETE 
@Path("{id}") 
Foo deleteObject(@PathParam("id") Long id); 

Для получения дополнительной информации см. Resteasy Transport Layer documentation.

Смежные вопросы