使用doTry-doCatch在Apache Camel中动态调用groovy脚本

ca1c2owp  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(289)

我正在构建一个路由,该路由调用一个groovy脚本,该脚本的路径是动态计算的,如果找不到该脚本,则默认为一个通用的静态脚本:

.doTry()
.toD("language://groovy:resource:classpath:scripts/${exchangeProperty.consumerType}ResponseHandler.groovy")
.doCatch(FileNotFoundException.class)
.script().groovy("resource:classpath:scripts/defaultResponseHandler.groovy")
.end()

问题是交换属性consumerType没有被解析,因为toD的uri字符串参数是使用groovy计算的,而不是简单的。

MultipleCompilationErrorsException -> startup failed:
    Script_09b4150584d9e2c979353feee06897b5.groovy: 1: Unexpected input: 'scripts/${exchangeProperty.consumerType}' @ line 1, column 20.
       resource:classpath:scripts/${exchangeProperty.consumerType}ResponseHandler.groovy
                      ^
1 error

我怎样才能获得想要的行为?

y0u0uwnf

y0u0uwnf1#

根据此处显示的错误,Camel似乎无法解析您在toD()中提供的字符串。
默认情况下,传递给动态to的表达式被计算为Simple语言,但是,如To Dynamic Camel documentation中所述,您可以为动态计算指定其他语言。
在您的示例中,您尝试使用groovy语言计算端点,但随后使用Simple语言替换了脚本的一部分名称。
我找到的一个解决方案(但不是最好的)是将解释字符串的语言指定为简单的,然后使用language:groovy指定需要调用的端点。
你可以这样写:

.doTry() 
 .toD("language:simple:language://groovy:resource:classpath:scripts/${exchangeProperty.consumerType}ResponseHandler.groovy")
.doCatch(FileNotFoundException.class)
 .script().groovy("resource:classpath:scripts/defaultResponseHandler.groovy")
.end()

看起来很有效,但我希望其他人能想出更好的解决方案。

相关问题