具有AWS DynamoDB(aws-ddb)URI参数的Apache Camel

时间:2014-06-05 16:55:12

标签: amazon-web-services apache-camel amazon-dynamodb

我尝试使用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}&amp;secretKey=RAW(${sKey})&amp;maxMessagesPerPoll=10&amp;deleteAfterRead=true"/>
        <unmarshal>
            <camel:json library="Jackson"/>
        </unmarshal>

        <to uri="aws-ddb:my_table?accessKey=${aKey}&amp;secretKey=RAW(${sKey})&amp;readCapacity=15&amp;writeCapacity=100&amp;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个未记录的参数时,我再也无法重现此错误。

所以我的问题是:

  1. 为什么AWS请求PutItem请求的哈希密钥数据?
  2. 为什么我不能再重现这种行为?
  3. 我无法在Camel或AWS文档中找到任何提示,谷歌搜索只会发现一些不相关的结果。

1 个答案:

答案 0 :(得分:1)

您是否也没有指定Dynamo数据库表所属的区域?

我遇到了同样的问题,发现我的数据存储在美国东部地区,而不是我的桌子所在的地区。 回答你的两个问题,那就是:

  1. 由于表格不存在,Camel AWS会尝试为您创建表格,如DdbEndpoint类中所示。就个人而言,我不喜欢这种副作用,但它存在:/ 这意味着突然需要这些属性。

  2. 第一次尝试后无法重现它,因为现在它已经创建了:) 删除表格,您就可以重现它。

  3. 所以我的解决方案是使用区域集指定我自己的AmazonDynamoDBClient,然后将其放入注册表中,以便可以从路径中找到参数:amazonDDBClient

    希望它有所帮助!