我尝试使用Apache Camel使用以下路由定义将消息从AWS SQS路由到AWS Dynamo DB:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="aws-sqs://my_queue?accessKey=${aKey}&secretKey=RAW(${sKey})&maxMessagesPerPoll=10&deleteAfterRead=true"/>
<unmarshal>
<camel:json library="Jackson"/>
</unmarshal>
<to uri="aws-ddb:my_table?accessKey=${aKey}&secretKey=RAW(${sKey})&readCapacity=15&writeCapacity=100&operation=PutItem"/>
</route>
</camelContext>
但是在执行时,Camel抱怨Dynamo Db URI缺少一些必需的参数:
org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: aws-ddb://table?amazonDDBClient=%23ddbClient&amazonDdbEndpoint=ap-southeast-2&readCapacity=10&writeCapacity=10 due to: Status Code: 400, AWS Service: AmazonDynamoDB, AWS Request ID: KHA79STK78SHC2BG2R8HLPF7RJVV4KQNSO5AEMVJF66Q9ASUAAJG, AWS Error Code: ValidationException, AWS Error Message: 2 validation errors detected: Value null at 'keySchema.hashKeyElement.attributeName' failed to satisfy constraint: Member must not be null; Value null at 'keySchema.hashKeyElement.attributeType' failed to satisfy constraint: Member must not be null
有趣的是,Camel DDB doc中的任何地方都没有描述这两个参数。我花了一些时间浏览Camel源代码,发现了2个未记录的URI参数:keyAttributeName&amp; keyAttributeType,对我来说非常适合。 (我希望我的这个发现能帮助某人)。
现在更有趣的是,不应该要求将这些项目插入Dynamo DB,但是当我从URI中删除2个未记录的参数时,我再也无法重现此错误。
所以我的问题是:
我无法在Camel或AWS文档中找到任何提示,谷歌搜索只会发现一些不相关的结果。
答案 0 :(得分:1)
您是否也没有指定Dynamo数据库表所属的区域?
我遇到了同样的问题,发现我的数据存储在美国东部地区,而不是我的桌子所在的地区。 回答你的两个问题,那就是:
由于表格不存在,Camel AWS会尝试为您创建表格,如DdbEndpoint类中所示。就个人而言,我不喜欢这种副作用,但它存在:/ 这意味着突然需要这些属性。
第一次尝试后无法重现它,因为现在它已经创建了:) 删除表格,您就可以重现它。
所以我的解决方案是使用区域集指定我自己的AmazonDynamoDBClient,然后将其放入注册表中,以便可以从路径中找到参数:amazonDDBClient
希望它有所帮助!