我正在尝试使用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文档中没有任何描述。我花了一些时间浏览Camel源代码,发现了2个未记录的URI参数:keyAttributeName &keyAttributeType,这对我来说工作得很好。(我希望我的发现也能帮助到别人)。
现在更有趣的是,这些不应该被请求插入项目到Dynamo DB,但是当我从URI中删除2个未记录的参数时,我再也不能重现这个错误了。
我的问题是:
- 为什么AWS要为putiitem请求请求hash key数据?
- 为什么我不能再复制这个行为?
我在Camel或AWS文档中找不到任何提示,谷歌只发现了一些无关的结果。
可能是因为您没有指定您的Dynamo DB表所属的区域?
我遇到了同样的问题,并且发现我的数据存储在US East区域,而不是我的表所在的区域。然后回答你的两个问题:
-
由于表不存在,Camel AWS尝试为您创建它,如在dddbendpoint类中所示。就我个人而言,我不喜欢这种副作用,但它确实存在
-
你不能在第一次尝试后复制它,因为现在它已经创建了:)
所以我的解决方案是指定我自己的AmazonDynamoDBClient与区域设置,然后把它放在注册表中,这样它就可以从路由中找到参数:amazonDDBClient
希望有帮助!