2013-02-20 190 views
0

我使用RESTlet作为服务器和客户端。服务器运行在Tomcat上,我可以从浏览器访问它。将Apache HTTP客户端连接到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 – 2014-02-14 01:00:01

回答

0

每证据指向此错误是在客户端的Restlet内部。我使用了URL.getInputStream(),而不是使用它,因此我可以轻松地对我的RESTlet服务器进行10K个连续呼叫。当然,URL很简单,它无法处理错误,不应该在生产中使用,但它证明RESTlet不值得。

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

+0

该API的Restlet有HttpURLConnection的集成(因为现在的版本2.2 RC1默认的HTTP客户端)所以没有理由说Restlet会有什么重大的事情。我们确实有一个错误需要解决,但是使用Restlet API高级功能并不是正交于具有良好性能。 – 2014-02-14 01:25:32

1

我有同样的问题,而是一个活的生产机器造成我的服务器吃掉100%的CPU上。我能够通过回到使用restlet 2.1.0而不是2.1.2来解决它。不是真正解决底层问题的答案,但绝对是一个解决方案。