【问题标题】:Bind aws sqs region camel绑定aws sqs region骆驼
【发布时间】:2016-08-05 22:49:29
【问题描述】:

所以我正在尝试使用 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] 类型的属性值转换为 属性“区域”所需的类型 [com.amazonaws.regions.Region]; 嵌套异常是 java.lang.IllegalStateException: 无法转换 [java.lang.String] 类型的值到所需类型 [com.amazonaws.regions.Region] 属性“区域”:无匹配 找到编辑器或转换策略

我还没有找到任何关于通过 Spring xml 配置 sqs 的信息。有时我认为 apache camel 已经过时或者没有人将它与 sqs 一起使用。 此外,下一步是连接在 Java DSL 实现中运行良好的扩展 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>

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

我遇到了下一个问题。加载路由器等后Apache骆驼停止运行。

[                          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>

【问题讨论】:

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


    【解决方案1】:

    region 属性的值是字符串值"com.amazonaws.regions.Region"。它需要一个 com.amazonaws.regions.Region 类型的对象。所以你需要引用一个Region类型的对象,而不是提供一个String值。

    【讨论】:

    • 感谢重播。我解决了这些问题(检查 upd 部分),但遇到了另一个问题。
    【解决方案2】:

    假设问题。

    第一:

    要为您的对象添加属性,我只需创建新 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);
    

    就是这样!

    【讨论】:

    • 尝试执行此操作时遇到异常:java.lang.Exception: Unable to convert value org.springframework.beans.factory.config.MethodInvokingFactoryBean@521b30d2 to type com.amazonaws。地区.地区
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多