使用ProducerTemplate使用Camel进行代理身份验证

时间:2013-06-07 12:59:07

标签: apache-camel apache-servicemix

我有一个使用Camel并在ServiceMix服务器上运行的项目,但我似乎无法访问外部Web服务,我怀疑这是因为我无法正确设置代理身份验证。

Exchange exchange = producerTemplate.request(url, new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.getIn().setHeader(Exchange.HTTP_METHOD, "POST");
        exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json");
    }
});
response = exchange.getOut().getBody(String.class);

如果我在最后一行放置一个断点,我在交换对象中看到一个ConnectionTimedOutException,响应为空。

我尝试了多种方式设置代理。

1)我尝试在实现 CamelContextAware 的类中设置代理设置:

camelContext.getProperties().put("http.proxyHost", "...");
camelContext.getProperties().put("http.proxyPort", "8080");
camelContext.getProperties().put("http.proxyUser", "...");
camelContext.getProperties().put("http.proxyPassword", "...");
camelContext.getProperties().put("http.proxySet", "true");

这在独立模式下工作,但是当我在ServiceMix中部署代码时,camelContext对象为null。

2)我尝试在ServiceMix的 etc / system.properties 文件中设置代理设置。

3)我尝试在 camel-context.xml 中使用http-conf:conduit,如下所示:

<http-conf:conduit name="*.http-conduit">
    <http-conf:client ProxyServer="..." ProxyServerPort="8080" />
    <http-conf:proxyAuthorization>
        <conf-sec:UserName>...</conf-sec:UserName>
        <conf-sec:Password>...</conf-sec:Password>
    </http-conf:proxyAuthorization>
</http-conf:conduit>

但是,我认为只有使用cxf客户端才能正常工作。

没有任何效果,我需要它在ServiceMix上部署时才能工作。 任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

如果我是对的,问题就更像是无法访问SMX中的属性。 ServiceMix支持SpringDM,我建议使用它来从Configuration Admin请求属性。

0)假设您正在使用Spring,您的main-appContext xml必须放在 resources / META-INF / spring / 下,SMX会在那里查找它以初始化您的应用程序。

1)向ServiceMix / etc添加不同的属性文件(不要使用system.properties)。它必须命名为* .cfg,即: my.properties.cfg

1.5)确保已加载配置。在SMX中,输入:

config:update
config:list | grep my.prop.name

2)你需要这个文件由Spring DM解决。添加appcontext xml内容,如下所示(确保您拥有名称空间)。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/osgi-compendium 
       http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd">

    <osgix:cm-properties id="myProperties" persistent-id="my.properties" /> <!--without the extension-->
    <context:property-placeholder ignore-unresolvable="true" properties-ref="myProperties" />
</beans>

3。)同时导入此appcontext并通过$ {my.prop}占位符使用这些属性。

希望这有帮助!

答案 1 :(得分:1)

试试这段代码:

HTTPConduit conduit = (HTTPConduit)outMessage.getExchange().getConduit(outMessage);
HTTPClientPolicy policy = conduit.getClient();
policy.setProxyServer(PROXY_IP);
policy.setProxyServerPort(PROXY_PORT);
conduit.setClient(policy);