【问题标题】:Configuring HttpClient for usage as Restlet client配置 HttpClient 以用作 Restlet 客户端
【发布时间】:2010-07-18 11:15:58
【问题描述】:

我无法为我的客户端代码配置 Restlet。我正在使用 Restlet 2 和 HttpClient 4。我将扩展 jar 和 HttpClient jar 添加到构建路径中,它似乎可以工作。

但是,我不知道如何详细配置它。我没有手动创建任何客户端,而是使用ClientResources 进行交互,这是我直接使用 Restlet 的唯一部分。客户端的具体实例化似乎隐藏在框架实现中。我发现了一些如何配置客户端的提示,但它们都是为 Restlet 1.x 编写的。

具体来说,我想配置以下几个部分:

  • 更改客户端请求的用户代理。 clientResource.getClientInfo().setAgent(…) 不起作用。
  • 增加每台主机的并行连接数。
  • 为每个主机启用持久连接和池。显然,到目前为止,Restlet 会为每个 ClientResource 创建一个新连接,这并不是很有效。

当然,我已经看过HttpClientHelper,但我不知道在哪里以及如何添加它。已经在文档中搜索过,但没有找到。

感谢您的帮助!

【问题讨论】:

  • 我建议在 Restlet-discuss 邮件列表 (restlet.tigris.org/ds/viewForums.do) 上发布这个问题。 Restlet 2.0 应该会在接下来的几天内发布,因此如果有错误可能值得报告。
  • 我同意布鲁诺的观点。很高兴看到 Restlet 开发人员对此有何想法。您对默认 ClientResource 行为的低效率是正确的,并且线程安全问题加剧了它。
  • 问题好像已经提出来了:restlet.tigris.org/ds/…
  • 是的,我期待任何答案。
  • 目前没有答案,太糟糕了,Restlet 团队没有明确如何加快客户端的速度。

标签: java httpclient restlet


【解决方案1】:

首先,要确保您的 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 利用 HttpClient 的 ThreadSafeClientConnManager 描述的 here。它提到了对该链接的持久连接的支持。似乎这个对象也会处理你的池化问题。您可能希望重用 ClientResource 的同一实例来利用这一点。我没有立即意识到ClientResource 的线程安全政策,但我希望它是线程安全的。

【讨论】:

  • 感谢您的回答。不幸的是,设置用户代理仍然不起作用,restlet.org/documentation/2.0/jse/api/org/restlet/resource/… 声明 ClientResources 并非设计为在多个线程之间共享,这真的很糟糕。
  • 我应该刚刚阅读 Javadoc!我发现了一些有趣的东西,这可能不是使用ClientResource 的预期副作用。在使用ClientResource 实例发出请求后,requestResource.getNext() 的结果将返回用于执行调用的Client 对象。您可以通过提供给setNext(Uniform next) 来保存对该对象的引用并在将来的ClientResources 上重用它。由于 Client 封装了所有 HttpClient 对象,因此您可以节省重新创建所有这些对象的时间。我不确定这种方法会有多大的滥用!
  • 这个技巧实际上适用于一些并发请求。但是,如果请求数量增加并且请求比连接多得多,它就会开始随机抛出一些内部异常。所以我更喜欢官方的解决方案。不过感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多