我目前正在使用 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>
我的 Camel 路线:
<route id="pollMessages">
<from id="sqsEndpoint" uri="aws-sqs://{{queue.name}}?amazonSQSClient=#sqsClient&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&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 客户端绑定(bind)到注册表 (registry.bind) 但我无法在除 JNDI 之外的任何注册表上找到绑定(bind)方法
我也试过这个:
SimpleRegistry registry = new SimpleRegistry();
registry.put("sqsClient", sqsClient());
CamelContext camelContext = new DefaultCamelContext(registry);
但得到了同样的错误。
我进行了很多搜索并尝试阅读,计划继续做更多但无法找到任何完成我需要做的事情的完整示例。片段在这里很有帮助。
非常感谢任何帮助。谢谢
最佳答案
对于 amazonSQSClient=#sqsClient
参数,Camel 尝试在注册表 (ApplicationContextRegistry) 中找到一个条目,其中键是 sqsClient
。
在您的第一个解决方案中(您在 xml 中指定了 bean),您设置了 bean 的 id
并且 Camel 在 ApplicationContextRegistry 中使用 id=sqsClient
注册了 bean。但是当您在代码中配置 bean 时,您还没有设置它的 ID/名称,所以 Camel 没有找到它。要使其工作,您必须设置 Bean 的名称!
解决方法:
@Bean(name = "sqsClient")
public AmazonSQS sqsClient(){
ClientConfiguration clientConfiguration = new ClientConfiguration();
AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration);
client.setEndpoint(sqsEndpoint);
return client;
}
关于java - Camel,Amazon SQS - 没有类型转换器可用于将类型 : java. lang.String 转换为所需类型 : com. amazonaws.services.sqs.AmazonSQS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245645/