2015-12-21 60 views
0

我有使与SQS邮件到我的本地数据库的简单路径:示例语法油门

class DlrSqsToDb extends RouteBuilder { 
    """aws-sqs://123467890/test-queue?amazonSQSClient=%23awsSqsClient&amazonSQSEndpoint=https://sqs.eu-west-1.amazonaws.com""" ==> { 
    setHeader("dlr_body", body) 
    setHeader("msgid", "someid") 
    to("sql:insert into camel_test (msgid, dlr_body) VALUES (:#msgid,:#dlr_body)?dataSource=dataSource") 
    } 
} 

我想扼杀这让SQS处理峰值,但让我的本地数据库负载是有限的。我可以做,例如延迟(),而不是油门():

.... 
"""aws-sqs://123467890/test-queue?amazonSQSClient=%23awsSqsClient&amazonSQSEndpoint=https://sqs.eu-west-1.amazonaws.com""" ==> { 
delay(3000) 
.... 

的作品,但

.... 
"""aws-sqs://123467890/test-queue?amazonSQSClient=%23awsSqsClient&amazonSQSEndpoint=https://sqs.eu-west-1.amazonaws.com""" ==> { 
throttle(1) 
.... 

不能编译:

[error] found : Int(1) 
[error] required: org.apache.camel.scala.Frequency 
[error]  throttle(1) 

.... 
"""aws-sqs://123467890/test-queue?amazonSQSClient=%23awsSqsClient&amazonSQSEndpoint=https://sqs.eu-west-1.amazonaws.com""" ==> { 
throttle(new org.apache.camel.scala.Frequency(1,3000)) 
.... 

编译但崩溃的错误:

.... because of Definition has no children on Throttle[{1} request per 3000 millis -> []] 

在scala中使用节流阀的正确语法是什么?

回答

1

尝试包裹下一个“为”在节流块,像这样:

"""aws-sqs://123467890/test-queue?amazonSQSClient=%23awsSqsClient&amazonSQSEndpoint=https://sqs.eu-west-1.amazonaws.com""" ==> { 
     setHeader("dlr_body", body) 
     setHeader("msgid", "someid") 
     throttle(1 per (3 seconds)) { 
     to("sql:insert into camel_test (msgid, dlr_body) VALUES (:#msgid,:#dlr_body)?dataSource=dataSource") 
     } 
    } 

这是未经测试,但我怀疑这是因为你需要明确有关使最后的块语法'给'一个油门的孩子。令人遗憾的是,我发现骆驼scala dsl对陈述的顺序非常挑剔,但对实际编译的内容却非常松懈。

+0

它导致正确的解决方案,谢谢! – FelixHJ