2013-02-20 1 views
0

Я использую RESTlet как сервер и клиент. Сервер работает над Tomcat, и я могу получить к нему доступ из браузера.Присоединение HTTP-клиента Apache к клиенту RESTlet

Для Клиента я использую org.restlet.resource.ClientResource. Он отлично работает, если я отправить несколько запросов к этому серверу, но если я посылаю несколько сотен звонков он ломает:

Fev 20, 2013 12:59:43 PM org.restlet.engine.connector.ClientConnectionHelper start 
INFO: Starting the internal [HTTP/1.1] client 
(some calls work) 
Fev 20, 2013 1:00:49 PM org.restlet.util.SelectionRegistration block 
WARNING: The thread blocked at the cyclic barrier has timed out 
java.util.concurrent.TimeoutException 
    at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) 
    at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:427) 
    at org.restlet.util.SelectionRegistration.block(SelectionRegistration.java:191) 
    at org.restlet.engine.io.NbChannelInputStream.onFill(NbChannelInputStream.java:230) 
    at org.restlet.engine.io.Buffer.process(Buffer.java:601) 
    at org.restlet.engine.io.NbChannelInputStream.read(NbChannelInputStream.java:307) 
    at java.io.InputStream.read(InputStream.java:101) 
    at org.restlet.engine.io.BioUtils.copy(BioUtils.java:80) 
    at org.restlet.engine.io.NioUtils.copy(NioUtils.java:147) 
    at org.restlet.representation.ReadableRepresentation.write(ReadableRepresentation.java:104) 
    at org.restlet.representation.ChannelRepresentation.write(ChannelRepresentation.java:76) 
    at org.restlet.representation.ChannelRepresentation.write(ChannelRepresentation.java:82) 

Exception in thread "main" java.io.IOException: The thread blocked at the cyclic barrier has timed out. 
    at org.restlet.util.SelectionRegistration.block(SelectionRegistration.java:197) 
    at org.restlet.engine.io.NbChannelInputStream.onFill(NbChannelInputStream.java:230) 
    at org.restlet.engine.io.Buffer.process(Buffer.java:601) 
    at org.restlet.engine.io.NbChannelInputStream.read(NbChannelInputStream.java:307) 
    at java.io.InputStream.read(InputStream.java:101) 
    at org.restlet.engine.io.BioUtils.copy(BioUtils.java:80) 
    at org.restlet.engine.io.NioUtils.copy(NioUtils.java:147) 
    at org.restlet.representation.ReadableRepresentation.write(ReadableRepresentation.java:104) 
    at org.restlet.representation.ChannelRepresentation.write(ChannelRepresentation.java:76) 
    at org.restlet.representation.ChannelRepresentation.write(ChannelRepresentation.java:82) 
Caused by: java.util.concurrent.TimeoutException 
    at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) 
    at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:427) 
    at org.restlet.util.SelectionRegistration.block(SelectionRegistration.java:191) 
    ... 11 more 

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

+0

Я подтверждаю, что это ошибка из-за новой реализации NioUtils.copy(). См. Эту проблему GitHub для получения дополнительной информации: https://github.com/restlet/restlet-framework-java/issues/805#issuecomment-34860997 –

ответ

0

Каждое доказательство указывает на то, что эта ошибка является внутренней в клиенте RESTlet. Вместо того, чтобы использовать его, я использовал URL.getInputStream(), и с этим мне удалось легко сделать 10K последовательных вызовов на моем сервере RESTlet. Конечно, URL-адрес прост, он не способен обрабатывать ошибки и не должен использоваться в процессе производства, но он доказал, что RESTlet не стоит.

Мне также удалось установить Benchmark, сравнивая Axis2 и RESTlet как сервер, и у них была такая же производительность, что и 3-5 milisecs для ответа на запрос, я ожидал, что REST будет быстрее ... Я реализовал сервер REST прямо из Servlet, и он тоже 0-1 milisecs, чтобы ответить. Из-за этого я решил отказаться от REST и придерживаться SOAP Axis2, он не медленнее RESTlet и всего на несколько миллисекундов медленнее, чем Servlet, но он более гибкий и мощный.

+0

. API-интерфейс Restlet имеет интеграцию с HttpURLConnection (теперь клиент HTTP по умолчанию с версии 2.2 RC1) , поэтому нет причин, по которым у Restlet был бы значительный удар. У нас есть ошибка для исправления, как описано здесь, но использование функций верхнего уровня API-интерфейса Restlet не является ортогональным к хорошей производительности. –

1

У меня была такая же проблема, но на живой производственной машине, которая заставила мой сервер съесть 100% процессора. Я смог решить это, вернувшись к использованию restlet 2.1.0 вместо 2.1.2. Не совсем ответ на лежащую в основе проблему, но определенно решение.

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

  • Нет связанных вопросов^_^