2010-07-18 33 views
5

我堅持爲我的客戶端代碼配置Restlet。我正在使用Restlet 2和HttpClient 4.我將擴展jar和HttpClient jar添加到構建路徑,它似乎工作。配置HttpClient作爲Restlet客戶端使用

但是,我不知道如何詳細配置它。我不會手動創建任何客戶端,而是使用ClientResource進行交互,這是我直接使用Restlet的唯一部分。客戶端的具體實例似乎隱藏在框架實現中。我發現了一些提示,我可以配置客戶端,但它們都是爲Restlet 1.x編寫的。

具體,我想配置以下部分組成:

  • 更改用戶代理客戶端請求。 clientResource.getClientInfo().setAgent(…)不起作用。
  • 增加每個主機的並行連接數。
  • 爲每個主機啓用持續連接和池。顯然,Restlet目前爲ClientResource創建了一個新的連接,這並不是很有效。

當然,我已經看過HttpClientHelper,但我不知道在哪裏以及如何添加這個。已經搜索了該文件,但沒有命中。

感謝您的幫助!

+2

我建議在Restlet討論郵件列表(http://restlet.tigris.org/ds/viewForums.do)上發佈這個問題。 Restlet 2.0應該在接下來的幾天內發佈,所以如果有bug的話可能值得報告。 – Bruno 2010-07-19 14:33:35

+0

我同意布魯諾。很高興看到Restlet開發人員對此的看法。您對無效的默認'ClientResource'行爲以及線程安全性問題使其惡化是正確的。 – laz 2010-07-20 18:54:31

+0

它看起來像問題已提出:http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2635381 – laz 2010-07-20 19:00:43

回答

4

首先,爲了確保Restlet使用Apache的HttpClient進行連接,您需要在類路徑中使用org.restlet.ext.httpclient.jar。其次,你是否將Context傳入你的ClientResource的構造函數中?如果沒有,你將需要:

final Context context = new Context(); 
    context.getParameters().set("maxConnectionsPerHost", "20"); 

    final ClientResource requestResource = new ClientResource(context, "http://localhost:8182/request"); 
    requestResource.getClientInfo().setAgent("Example-Client/1.0"); 

這需要照顧maxConnectionsPerHost設置你感興趣的同時,呼籲setAgent正在如預期的我。我不確定在您的實例中可能存在什麼問題。

關於持續連接,看起來HttpClient爲你照顧。 Restlet利用描述爲here的HttpClient的ThreadSafeClientConnManager。它提到了對該鏈接的持久連接的支持。看來這個對象也會照顧你的關注點。你會想重複使用ClientResource的相同實例來利用這一點。我並不知道ClientResource的線程安全策略,但我希望它是線程安全的。

+0

感謝您的回答。不幸的是,設置用戶代理仍然不起作用,並且http://www.restlet.org/documentation/2.0/jse/api/org/restlet/resource/ClientResource。html指出ClientResources不是被設計成在幾個線程之間共享的,這非常糟糕。 – 2010-07-18 17:03:07

+1

我應該剛剛閱讀Javadoc!我發現了一些有趣的東西,可能不是使用'ClientResource'的預期副作用。在使用'ClientResource'實例發出請求後,'requestResource.getNext()'的結果將返回用於執行調用的'Client'對象。您可以通過提供給'setNext(Uniform next)'來保存對該對象的引用,並在將來的'ClientResources'上重用它。由於'Client'封裝了所有的HttpClient對象,因此您可以節省重新創建所有這些對象。我不確定這種方法會造成多大的濫用! – laz 2010-07-18 23:14:36

+0

這個技巧實際上適用於某些併發請求。但是,如果請求數量增加並且請求數量比連接數量多得多,它就會隨機拋出一些內部異常。所以我更喜歡官方的解決方案。儘管如此,謝謝你的提示。 – 2010-07-22 08:35:59