如何设置 Camel RESTful 客户端超时和 HTTPClientPolicy
How to set Camel RESTful client timeout and HTTPClientPolicy
我们在 spring 应用程序中使用 Camel 2.14,并利用 Camel CXF-RS 组件 (http://camel.apache.org/cxfrs.html) 在第三方服务上生成 RESTful 请求。
当他们的服务器离线并且 Camel 无法连接时,它不会超时 30 秒。我们希望能够调整此超时值,但正在努力了解如何做到这一点。谁能给点建议?
我们可以看到 Camel 本身使用从 HTTPClientPolicy 对象获取的值,该对象上有一个 setConnectionTimeOut..但是我们如何获取这个对象?
我们能否以编程方式获取 HTTPClientPolicy 对象?或者我们必须在传递给 template.send() 的 Camel URI 中引用它,例如:
template.send("cxfrs://" + url + "/match/" + appId + "/" + reqId?httpClientAPI=true&http.connection.timeout=5000
如果您想使用 XML 文件配置端点超时,raphaëλ 之前发布的 link 是正确的。
但是如果你想完全以编程方式完成它,你可以使用 cxf 组件的选项之一(cxfEndpointConfigurer)来完成它,如 this camel-cxf component unit-test.
在你的情况下它会是这样的:
template.send("cxfrs://" + url + "/match/" + appId + "/" + "reqId?httpClientAPI=true&cxfEndpointConfigurer=#endpointConfigurer"
那么你需要一个 "endpointConfigurer" bean,其配置如下:
@Component("endpointConfigurer")
public class TemplateEndpointConfigurer implements CxfEndpointConfigurer {
@Override
public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
// Do nothing here
}
@Override
public void configureClient(Client client) {
final HTTPConduit conduit = (HTTPConduit) client.getConduit();
final HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(webServiceConnectionTimeout);
policy.setReceiveTimeout(webServiceReadTimeout);
policy.setConnection(ConnectionType.CLOSE);
conduit.setClient(policy);
}
@Override
public void configureServer(Server server) {
// Do nothing here
}
}
虽然这个回答有点晚了,但我希望它能对你的项目有所帮助。
我们在 spring 应用程序中使用 Camel 2.14,并利用 Camel CXF-RS 组件 (http://camel.apache.org/cxfrs.html) 在第三方服务上生成 RESTful 请求。
当他们的服务器离线并且 Camel 无法连接时,它不会超时 30 秒。我们希望能够调整此超时值,但正在努力了解如何做到这一点。谁能给点建议?
我们可以看到 Camel 本身使用从 HTTPClientPolicy 对象获取的值,该对象上有一个 setConnectionTimeOut..但是我们如何获取这个对象?
我们能否以编程方式获取 HTTPClientPolicy 对象?或者我们必须在传递给 template.send() 的 Camel URI 中引用它,例如:
template.send("cxfrs://" + url + "/match/" + appId + "/" + reqId?httpClientAPI=true&http.connection.timeout=5000
如果您想使用 XML 文件配置端点超时,raphaëλ 之前发布的 link 是正确的。 但是如果你想完全以编程方式完成它,你可以使用 cxf 组件的选项之一(cxfEndpointConfigurer)来完成它,如 this camel-cxf component unit-test.
在你的情况下它会是这样的:
template.send("cxfrs://" + url + "/match/" + appId + "/" + "reqId?httpClientAPI=true&cxfEndpointConfigurer=#endpointConfigurer"
那么你需要一个 "endpointConfigurer" bean,其配置如下:
@Component("endpointConfigurer")
public class TemplateEndpointConfigurer implements CxfEndpointConfigurer {
@Override
public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
// Do nothing here
}
@Override
public void configureClient(Client client) {
final HTTPConduit conduit = (HTTPConduit) client.getConduit();
final HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(webServiceConnectionTimeout);
policy.setReceiveTimeout(webServiceReadTimeout);
policy.setConnection(ConnectionType.CLOSE);
conduit.setClient(policy);
}
@Override
public void configureServer(Server server) {
// Do nothing here
}
}
虽然这个回答有点晚了,但我希望它能对你的项目有所帮助。