Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将HttpClient配置为用作Restlet客户端_Java_Httpclient_Restlet - Fatal编程技术网

Java 将HttpClient配置为用作Restlet客户端

Java 将HttpClient配置为用作Restlet客户端,java,httpclient,restlet,Java,Httpclient,Restlet,我无法为客户端代码配置Restlet。我正在使用restlet2和HttpClient 4。我将扩展jar和HttpClient jar添加到构建路径中,它似乎可以工作 但是,我不知道如何详细配置它。我不手动创建任何客户端,而是使用ClientResources进行交互,这是我唯一直接使用Restlet的部分。客户端的具体实例化似乎隐藏在框架实现中。我发现了一些关于如何配置客户端的提示,但它们都是为Restlet 1.x编写的 具体而言,我想配置以下部分: 更改客户端请求的用户代理client

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

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

具体而言,我想配置以下部分:

  • 更改客户端请求的用户代理<代码>clientResource.getClientInfo().setAgent(…)不工作
  • 增加每个主机的并行连接数
  • 启用每个主机的持久连接和池。显然,到目前为止,Restlet根据
    ClientResource
    创建了一个新的连接,这并不是很有效
当然,我已经看过了,但是我不知道在哪里以及如何添加这个。已经在文档中搜索过了,但是没有找到


谢谢你的帮助

首先,要确保Restlet使用Apache的HttpClient进行连接,需要在类路径上有org.Restlet.ext.HttpClient.jar。第二,您是否将
上下文
传递到
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
。它提到了对该链接的持久连接的支持。这个对象似乎也会处理您的池问题。您可能希望重用
ClientResource
的同一个实例来利用这一点。我现在还不知道
ClientResource
的线程安全策略,但我希望它是线程安全的。

谢谢你的回答。不幸的是,设置用户代理仍然不起作用,并且声明ClientResources没有被设计为在多个线程之间共享,这真的很糟糕。我应该读一下Javadoc!我发现了一些有趣的东西,可能不是使用
ClientResource
的预期副作用。使用
ClientResource
实例发出请求后,
requestResource.getNext()
的结果将返回用于执行调用的
Client
对象。通过提供给
setNext(Uniform next)
,您可以保存对该对象的引用,并在将来的
ClientResources
上重用它。由于
客户机
封装了您在重新创建所有这些对象时要保存的所有HttpClient对象。我不确定这种方法会被滥用到什么程度!这个技巧实际上适用于一些并发请求。但是,如果请求的数量增加,并且请求比连接多得多,它就会开始随机抛出一些内部异常。所以我更喜欢正式的解决方案。不过,谢谢你的提示。我建议将此问题发布在Restlet Discussion邮件列表()上。restlet2.0应该在接下来的几天内发布,因此如果有bug,可能值得报告。我同意Bruno的观点。看看Restlet开发人员对此有什么想法会很好。您对默认
ClientResource
行为的低效性和线程安全问题的看法是正确的。问题似乎已经提出:是的,我期待任何答案。到目前为止没有答案,太糟糕了,Restlet团队没有弄清楚如何加快客户端的速度。