2013-02-20 186 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來解決它。不是真正解決底層問題的答案,但絕對是一個解決方案。