使用 Apache Camel 的 Netty4 HTTP 组件通过代理进行 "external" 调用
Making "external" calls through proxy using Apache Camel's Netty4 HTTP component
我们使用 Apache Camel 的 Netty4 HTTP Component
处理我现在遇到问题的工件上的几乎所有内容。
问题是,现在需要代理才能对 Internet 进行 external/outbound 调用...最终这不起作用。所有的调用都得到 blocked/rejected — 只是为了记录,我们在不同的工件中遇到了同样的问题,我们能够通过使用 JVM 代理设置来绕过它,但是这个使用的是 Async Http Client.
我试过使用 http.proxyHost
、http.proxyPort
等在 JVM 级别设置 proxy,但这次没有用。
问题:有没有办法在此组件中配置任何代理设置?我一直在深入研究 org.apache.camel.component.netty4.http.NettyHttpConfiguration
看看是否有任何我可以 change/use 的相关设置——我不完全确定它在幕后使用的是什么 HTTP 客户端,我猜它可能是 Netty O :)
如果相关,我们的(其中一条)路线如下所示:
@Component
public final class Route extends AbstractRouteBuilder {
@Override
public void configure() throws Exception {
super.configure();
from("{{route.inbound.reports}}") // netty4-http:https://hostname.tld/api/v1/reports
.choice()
.when(header(Exchange.HTTP_METHOD).isEqualToIgnoreCase(HttpMethod.GET))
.toD("seda:get")
.choice()
.when(AbstractHelper::isOk)
.setProperty("source", constant("user"))
.to("seda:retrieve?timeout={{async.timeout:4500}}")
.setBody(simple("${property.results}"))
.marshal().json(JsonLibrary.Jackson)
.end()
.endChoice()
.otherwise()
.toD("{{route.artifact.reports}}");
from("seda:get")
.toD("{{route.artifact.reports}}")
.unmarshal().json(JsonLibrary.Jackson)
.to(exec("analyze"));
from("seda:retrieve")
.filter(PredicateBuilder.and(header(Key.ACCOUNT_ID).isNotNull()))
.setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.GET))
.setHeader(Header.API_KEY, simple("{{vendor.api-key}}"))
.toD("{{route.outbound.reports}}") // netty4-http:https://external-hostname.tld/api/client/reports
.unmarshal().json(JsonLibrary.Jackson)
.choice()
.when(AbstractHelper::isOk)
.to(exec("aggregate"))
.otherwise()
.to(exec("handleFailure"))
.end();
}
// ...
}
我们使用 Apache Camel 的 Netty4 HTTP Component
处理我现在遇到问题的工件上的几乎所有内容。
问题是,现在需要代理才能对 Internet 进行 external/outbound 调用...最终这不起作用。所有的调用都得到 blocked/rejected — 只是为了记录,我们在不同的工件中遇到了同样的问题,我们能够通过使用 JVM 代理设置来绕过它,但是这个使用的是 Async Http Client.
我试过使用 http.proxyHost
、http.proxyPort
等在 JVM 级别设置 proxy,但这次没有用。
问题:有没有办法在此组件中配置任何代理设置?我一直在深入研究 org.apache.camel.component.netty4.http.NettyHttpConfiguration
看看是否有任何我可以 change/use 的相关设置——我不完全确定它在幕后使用的是什么 HTTP 客户端,我猜它可能是 Netty O :)
如果相关,我们的(其中一条)路线如下所示:
@Component
public final class Route extends AbstractRouteBuilder {
@Override
public void configure() throws Exception {
super.configure();
from("{{route.inbound.reports}}") // netty4-http:https://hostname.tld/api/v1/reports
.choice()
.when(header(Exchange.HTTP_METHOD).isEqualToIgnoreCase(HttpMethod.GET))
.toD("seda:get")
.choice()
.when(AbstractHelper::isOk)
.setProperty("source", constant("user"))
.to("seda:retrieve?timeout={{async.timeout:4500}}")
.setBody(simple("${property.results}"))
.marshal().json(JsonLibrary.Jackson)
.end()
.endChoice()
.otherwise()
.toD("{{route.artifact.reports}}");
from("seda:get")
.toD("{{route.artifact.reports}}")
.unmarshal().json(JsonLibrary.Jackson)
.to(exec("analyze"));
from("seda:retrieve")
.filter(PredicateBuilder.and(header(Key.ACCOUNT_ID).isNotNull()))
.setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.GET))
.setHeader(Header.API_KEY, simple("{{vendor.api-key}}"))
.toD("{{route.outbound.reports}}") // netty4-http:https://external-hostname.tld/api/client/reports
.unmarshal().json(JsonLibrary.Jackson)
.choice()
.when(AbstractHelper::isOk)
.to(exec("aggregate"))
.otherwise()
.to(exec("handleFailure"))
.end();
}
// ...
}