Apache Camel with AWS DynamoDB (aws-ddb) URI parameters



我正在尝试使用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文档中没有任何描述。我花了一些时间浏览Camel源代码,发现了2个未记录的URI参数:keyAttributeName &keyAttributeType,这对我来说工作得很好。(我希望我的发现也能帮助到别人)。

现在更有趣的是,这些不应该被请求插入项目到Dynamo DB,但是当我从URI中删除2个未记录的参数时,我再也不能重现这个错误了。

我的问题是:

    为什么AWS要为putiitem请求请求hash key数据?
  1. 为什么我不能再复制这个行为?

我在Camel或AWS文档中找不到任何提示,谷歌只发现了一些无关的结果。

可能是因为您没有指定您的Dynamo DB表所属的区域?

我遇到了同样的问题,并且发现我的数据存储在US East区域,而不是我的表所在的区域。然后回答你的两个问题:

  1. 由于表不存在,Camel AWS尝试为您创建它,如在dddbendpoint类中所示。就我个人而言,我不喜欢这种副作用,但它确实存在

  2. 你不能在第一次尝试后复制它,因为现在它已经创建了:)

所以我的解决方案是指定我自己的AmazonDynamoDBClient与区域设置,然后把它放在注册表中,这样它就可以从路由中找到参数:amazonDDBClient

希望有帮助!

相关内容

  • 没有找到相关文章

最新更新