Конечная точка Apache Camel CXF - укажите http(s) прокси?

Я пытался настроить конечную точку CXF в Camel, используя конфигурацию Spring Java следующим образом:

@Bean
public CxfEndpoint anEndpoint() {
    CxfEndpoint endpoint = new CxfEndpoint();
    endpoint.setAddress(getEndpointUrl());
    endpoint.setServiceClass(ServiceSOAP.class);
    endpoint.setWsdlURL("/wsdl/ServiceSOAP.wsdl");

    String httpProxyHost = httpProxyHost();
    String httpProxyPort = httpProxyPort();

    Map<String, Object> properties = new HashMap<>();

    properties.put("https.proxyHost", httpProxyHost());
    properties.put("https.proxyPort", httpProxyPort());
    properties.put("http.proxyHost", httpProxyHost());
    properties.put("http.proxyPort", httpProxyPort());

    endpoint.setProperties(properties);
    return endpoint;
}

Однако это не работает ни для URL-адресов конечных точек http, ни для https.

Я также попытался установить эти свойства непосредственно в CamelContext с тем же результатом.

Маршрут работает нормально в среде с прямым подключением к Интернету, например, локально, но не там, где он развернут за http-прокси.

Мы используем Apache Camel 2.15.2 и Apache CXF 3.1.0. Любая помощь очень ценится!

1 ответ

Решение

Резолюция оказалась простой, но извилистой. Нужно использовать CxfEndpointConfigurator для настройки свойств HTTPConduit следующим образом:

@Bean
public CxfEndpoint anEndpoint() {
    CxfEndpoint endpoint = new CxfEndpoint();
    endpoint.setAddress(getEndpointUrl());
    endpoint.setServiceClass(ServiceSOAP.class);
    endpoint.setWsdlURL("/wsdl/ServiceSOAP.wsdl");

    endpoint.setCxfEndpointConfigurer(anEndpointClientConfigurer());

    return endpoint;
}

private CxfEndpointConfigurer anEndpointClientConfigurer() {
    return new CxfEndpointConfigurer() {

        @Override
        public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
        }

        @Override
        public void configureClient(Client client) {
                HTTPConduit conduit = (HTTPConduit) client.getConduit();
                HTTPClientPolicy policy = new HTTPClientPolicy();
                policy.setProxyServer(httpProxyHost());
                policy.setProxyServerPort(httpProxyPort());

                conduit.setClient(policy);
            }
        }

Рекомендации: thelsdj и 2

Другие вопросы по тегам