2010-07-18 68 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