throttle 的语法示例

Example for syntax for throttle

我有一个将消息从 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 处理峰值,但我的本地数据库上的负载是有限的。例如,我可以执行 delay(),但不能执行 throttle():

....
 """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 中使用 throttle 的正确语法是什么?

尝试像这样将下一个 'to' 包裹在油门块中:

"""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")
      }
  }

这是未经测试的,但我怀疑这是因为块语法,你需要明确地使最后的 'to' 成为节流阀的 child。可悲的是,我发现 camels scala dsl 对语句的顺序非常挑剔,但对实际编译的内容却非常松懈。