Camel,Amazon SQS - 没有类型转换器可用于从类型转换为java.lang.String到所需类型:com.amazonaws.services.sqs.AmazonSQS

时间:2015-01-30 22:23:31

标签: java spring amazon-web-services apache-camel amazon-sqs

我目前正在使用Camel开发一个Spring应用程序,它将轮询SQS作为应用程序的入口点(第一条路径)。 我成功地使用基于Spring的XML方法实现了这一目标。

我的AmazonSQSClient Bean:

<bean id="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient">
    <constructor-arg ref="sqsCredentialsProvider" />
    <property name="endpoint" value="${aws.sqs.endpoint}" />
</bean>

我的骆驼路线:

<route id="pollMessages">
    <from id="sqsEndpoint" uri="aws-sqs://{{queue.name}}?amazonSQSClient=#sqsClient&amp;deleteAfterRead=false" />
    <to uri="direct:readSQSMessage" />
</route>

通过上述方法,一切都按照我的要求运作。

现在我正在尝试将所有bean和Camel配置迁移到基于Java的方法。

我创建了我的Amazon SQS客户端Bean,如下所示:

@Bean
public AmazonSQS sqsClient(){
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration);
    client.setEndpoint(sqsEndpoint);

    return client;
}

而且,我正在创建Camel路线(片段),如下所示:

@Bean
public CamelContext camelContext() throws Exception{
    CamelContext camelContext = new DefaultCamelContext();

    camelContext.addRoutes(new RouteBuilder() {
        @Override
        public void configure() {

            from("aws-sqs://"+fulfillmentQueueName+"?amazonSQSClient=#sqsClient&amp;delay="+fulfillmentQueuePollInterval)
            .to("direct:parseSQSMessage");

            }
    });

    camelContext.start();
    return camelContext;
}

但是,我使用这种方法会出错:

java.lang.IllegalArgumentException:无法为属性找到合适的setter:amazonSQSClient因为没有相同类型的setter方法:java.lang.String也没有类型转换:没有类型转换器可用于转换类型:java.lang.String为所需类型:com.amazonaws.services.sqs.AmazonSQS,其值为#sqsClient

我读了here如何构建Java样式的Camel Route

我读了here我需要将AWS Client绑定到Registry(registry.bind)但是我无法在除JNDI之外的任何注册表中找到绑定方法

我也尝试了这个:

SimpleRegistry registry = new SimpleRegistry();
registry.put("sqsClient", sqsClient());

CamelContext camelContext = new DefaultCamelContext(registry);

但得到同样的错误。

我搜索了很多并尝试阅读,计划继续做更多但是我无法找到任何完整的例子来做我需要做的事情。片段在这里帮助很多。

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

对于amazonSQSClient=#sqsClient参数,Camel尝试在注册表(ApplicationContextRegistry)中找到密钥为sqsClient的条目。

在您的第一个解决方案中(您在xml中指定了bean),您设置了bean的id,并且Camel在ApplicationContextRegistry中使用id=sqsClient注册了bean。但是当你在代码中配置bean时,你还没有设置它的id / name,所以Camel没有找到它。要使它工作,你必须设置Bean的名称!

解决方案:

@Bean(name = "sqsClient")
public AmazonSQS sqsClient(){
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration);
    client.setEndpoint(sqsEndpoint);
    return client;
}

答案 1 :(得分:1)

尝试使用SpringCamelContext(它需要spring {#1}}作为构造函数参数) - 它将按bean名称查找sqs客户端&#34; sqsClient&#34;在应用程序上下文中。

如果你使用弹簧靴和骆驼弹簧,那么默认会创建ApplicationContext