将Apache HTTP Client附加到RESTlet客户端

时间:2013-02-20 16:12:32

标签: rest restlet apache-httpclient-4.x

我正在使用RESTlet作为服务器和客户端。服务器正在运行Tomcat,我可以从浏览器访问它。

对于Client,我正在使用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 Client来进行更多的调用,但我找不到有关如何附加它的文档。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但是在现场制作机器上导致我的服务器占用了100%的CPU。我可以通过回到使用restlet 2.1.0而不是2.1.2来解决这个问题。不是解决潜在问题的答案,但绝对是一种解决方案。

答案 1 :(得分:0)

每个证据都将此错误指向RESTlet客户端内部。我没有使用它,而是使用了URL.getInputStream(),并且我可以轻松地对我的RESTlet服务器进行10K顺序调用。当然,URL很简单,它无法处理错误,不应该在生产中使用,但事实证明RESTlet不值得。

我还设法使Benchmark将Axis2和RESTlet作为服务器进行比较,并且他们有相同的性能需要3-5毫秒来回答请求,我希望REST更快......我直接从Servlet实现了REST服务器0-1毫秒响应。因此我决定放弃REST并坚持使用SOAP Axis2,它不比RESTlet慢,只比Servlet慢几毫秒,但它更灵活,更强大。