绑定广场地区骆驼

时间:2016-08-05 22:49:30

标签: java xml amazon-web-services apache-camel

所以我尝试使用apache camel访问简单队列服务。

Java DSL方法工作正常,但我尝试使用xml配置。

private AmazonSQS sqs;
sqs = new AmazonSQSClient(credentials);
Region sqsRegion = Region.getRegion(Regions.US_WEST_2);
sqs.setRegion(sqsRegion);

上面的代码工作正常,但我决定构建bean。

<context:property-placeholder  location="classpath:/default.properties" />
    <bean name="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient">
        <constructor-arg>
            <bean class="com.amazonaws.auth.BasicAWSCredentials">
                <constructor-arg value="${access.key}"/>
                <constructor-arg value="${secret.key}"/>
            </bean>
        </constructor-arg>
        <property name="region" value="com.amazonaws.regions.Region"/>
    </bean>

我收到了错误

  

无法将[java.lang.String]类型的属性值转换为   属性&#39; region&#39;所需的类型[com.amazonaws.regions.Region];   嵌套异常是java.lang.IllegalStateException:无法转换   类型[java.lang.String]的值为必需的类型   [com.amazonaws.regions.Region]对于属性&#39; region&#39;:没有匹配   编辑或转换策略发现

我还没有通过Spring xml找到有关配置sqs的任何信息。有时我认为apache camel已经过时或者没有人使用sqs。 此外,下一步是连接可在Java DSL实现中正常工作的Extended SQS库,但我不知道如何通过xml配置队列。

UPD:

感谢@jbird,我用这种方式解决了问题:

<context:property-placeholder  location="classpath:/default.properties" />
    <bean id="awsRegion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass" value="com.amazonaws.regions.RegionUtils"/>
        <property name="targetMethod" value="getRegion"/>
        <property name="arguments">
            <list>
                <value>${aws.region}</value>
            </list>
        </property>
    </bean>

    <bean name="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient">
        <constructor-arg>
            <bean class="com.amazonaws.auth.BasicAWSCredentials">
                <constructor-arg value="${access.key}"/>
                <constructor-arg value="${secret.key}"/>
            </bean>
        </constructor-arg>
        <property name="region" ref="awsRegion"/>
    </bean>

所以,我刚刚解析了包含aws.key,aws.secret和区域设置的default.properties文件。

然后我遇到了下一个问题。 Apache camel在加载路由器后停止运行,依此类推。

[                          main] SpringCamelContext             INFO  Route: route1 started and consuming from: Endpoint[aws-sqs://queue?amazonSQSClient=%23sqsClient]
[                          main] SpringCamelContext             INFO  Total 1 routes, of which 1 are started.
[                          main] SpringCamelContext             INFO  Apache Camel 2.17.2 (CamelContext: camel-1) started in 6.105 seconds

Process finished with exit code 0

路由器:

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MyRouteBuilder extends RouteBuilder {

    public void configure() {
        from("aws-sqs://queue?amazonSQSClient=#sqsClient")
                .log("We have a message! ${body}")
                .to("file:target/output?fileName=login-message-${date:now:MMDDyy-HHmmss}.json");
    }
}

和camel-context.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"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
       ">

    <context:property-placeholder  location="classpath:/default.properties" />

    <bean id="awsRegion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass" value="com.amazonaws.regions.RegionUtils"/>
        <property name="targetMethod" value="getRegion"/>
        <property name="arguments">
            <list>
                <value>${aws.region}</value>
            </list>
        </property>
    </bean>

    <bean name="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient">
        <constructor-arg>
            <bean class="com.amazonaws.auth.BasicAWSCredentials">
                <constructor-arg value="${access.key}"/>
                <constructor-arg value="${secret.key}"/>
            </bean>
        </constructor-arg>
        <property name="region" ref="awsRegion"/>
    </bean>

    <!-- enable Spring @Component scan -->
    <context:component-scan base-package="com.test.router"/>

    <camelContext xmlns="http://camel.apache.org/schema/spring">

        <contextScan/>
    </camelContext>

</beans>

2 个答案:

答案 0 :(得分:1)

region属性的值是字符串值"com.amazonaws.regions.Region"。期待类型为com.amazonaws.regions.Region的对象。因此,您需要引用类型为Region的对象,而不是提供String值。

答案 1 :(得分:0)

假设这个问题。

第一:

要向对象添加属性,我只需创建新bean

 <bean id="awsRegion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass" value="com.amazonaws.regions.RegionUtils"/>
        <property name="targetMethod" value="getRegion"/>
        <property name="arguments">
            <list>
                <value>${aws.region}</value>
            </list>
        </property>
    </bean>

并创建参考

<property name="region" ref="awsRegion"/>

第二

运行Apache Camel

Main main = new Main();
        main.setApplicationContextUri("/META-INF/spring/camel-contex.xml");
        main.run(args);

多数民众赞成!