Camel end vs endChoice - 不是通常的查询
Camel end vs endChoice - not the usual query
首先,是的,我进行了搜索,是的,我已经阅读了每个指向的同一个 Apache 文档。 :-) 我觉得有点混乱,我想我知道答案,所以让我举一个我认为正确的例子,然后用我认为的答案来跟进。谢谢。哦,我确实知道某些 endChoice() 行并不是绝对必要的,Camel 会弄清楚,但我喜欢这些块被清楚地描绘出来,除非有某些理由不使用它们。
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close inner when block
.end() // close inner choice block
.endChoice() // close first outer when
.when(X2)
// do other stuff
.endChoice() // close second outer when
.end() // close outer choice
因此,我最初查看 API 时,我认为 end() 用于关闭诸如选择和拆分之类的内容,而 endChoice() 用于关闭诸如 when 和 otherwise 之类的选择选项。看起来更像是后者实际上是一个 returns 一个 ChoiceDefinition 的 end()。这让名字好一点。
但是,如果我取出标记为 'close inner choice block' 的 end(),这意味着我将继续到下一行,即 endChoice()。这会关闭内部选择块吗?鉴于此,when(X2) 仍在 when(X1) 块内。所以,我认为我需要用 endChoice() 替换 end() 而不是删除它。所以结果看起来像:
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close inner when block
.endChoice() // close inner choice block
.endChoice() // close first outer when
.when(X2)
// do other stuff
.endChoice() // close second outer when
.end() // close outer choice
这是在 Camel 中处理这个问题的方法吗?还是有一种我只是想念的更简单的方法?谢谢你的时间。
简答:
我会在这件事上自称,所以没有其他人必须这样做,答案是你做错了,不应该有嵌套的选择。
长答案:
我继承了一个复杂的路线构建器,并试图清理它以使其更清晰。但是拉直并放入 end() 或 endChoice() 只会破坏事情。而且,是的,上面的修复仍然破坏了东西。我不明白骆驼是怎么知道要去哪个街区的。研究并试图找到嵌套的好例子最终使人们明白了 Camel 不是 真正为嵌套选择而设计的事实。它允许,但由于 Java 的限制,它做得不好。所以我尝试删除我的嵌套选择。虽然这是可能的,但这意味着丑陋的冗余条件,例如:
choice()
.when(x and a)
//do stuff xa
.when(x not a)
// do other x stuff
.when(y and a)
// do y stuff
只有我的至少有另一个级别。进一步思考和回忆我读过的东西带来了第二点启示。骆驼的重点是指导路线。每个选择的 when 块应该只是将流程指向一条路线。它不应该是思考、处理或任何东西。最后,我们的小组将进行重构,以将大部分逻辑从路由构建器移除到一个 bean。我们将致力于的设计将很简单:
from(uri)
.bean(class, method) // do any processing
.choice()
.when(header("result").isEqualTo("A")
.to(routeA)
.endChoice()
.when(header("result").isEqualTo("B")
.to(routeB)
.endChoice()
.when(header("result").isEqualTo("C")
.to(route)
.endChoice()
.end()
我的建议是避免嵌套选择。特别复杂的。您可能会让它工作,但是当您以后必须进行更改时,您将无法信任它。如果您发现自己很想使用嵌套选择,请检查您要完成的任务并确定它是否真的属于路由构建器。
游戏来晚了,但可能会有所帮助。
嵌套的选择定义在 Camel 中工作得很好。只有你的终止符是错误的:
.endChoice()
--> 关闭“when”谓词
.end()
--> 关闭整个“选择”块
我知道,语法有点混乱。
所以在你的情况下:
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close Y condition
.end() // close inner choice block
.endChoice() // close X1 condition
.when(X2)
// do other stuff
.endChoice() // close X2 condition
.otherwise()
// default case
.endChoice() // close default condition
.end()
实际上,您不必关闭所有 when
谓词,仅针对多个子路由。以我的拙见,对缩进非常细致有很大帮助。
首先,是的,我进行了搜索,是的,我已经阅读了每个指向的同一个 Apache 文档。 :-) 我觉得有点混乱,我想我知道答案,所以让我举一个我认为正确的例子,然后用我认为的答案来跟进。谢谢。哦,我确实知道某些 endChoice() 行并不是绝对必要的,Camel 会弄清楚,但我喜欢这些块被清楚地描绘出来,除非有某些理由不使用它们。
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close inner when block
.end() // close inner choice block
.endChoice() // close first outer when
.when(X2)
// do other stuff
.endChoice() // close second outer when
.end() // close outer choice
因此,我最初查看 API 时,我认为 end() 用于关闭诸如选择和拆分之类的内容,而 endChoice() 用于关闭诸如 when 和 otherwise 之类的选择选项。看起来更像是后者实际上是一个 returns 一个 ChoiceDefinition 的 end()。这让名字好一点。
但是,如果我取出标记为 'close inner choice block' 的 end(),这意味着我将继续到下一行,即 endChoice()。这会关闭内部选择块吗?鉴于此,when(X2) 仍在 when(X1) 块内。所以,我认为我需要用 endChoice() 替换 end() 而不是删除它。所以结果看起来像:
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close inner when block
.endChoice() // close inner choice block
.endChoice() // close first outer when
.when(X2)
// do other stuff
.endChoice() // close second outer when
.end() // close outer choice
这是在 Camel 中处理这个问题的方法吗?还是有一种我只是想念的更简单的方法?谢谢你的时间。
简答: 我会在这件事上自称,所以没有其他人必须这样做,答案是你做错了,不应该有嵌套的选择。
长答案: 我继承了一个复杂的路线构建器,并试图清理它以使其更清晰。但是拉直并放入 end() 或 endChoice() 只会破坏事情。而且,是的,上面的修复仍然破坏了东西。我不明白骆驼是怎么知道要去哪个街区的。研究并试图找到嵌套的好例子最终使人们明白了 Camel 不是 真正为嵌套选择而设计的事实。它允许,但由于 Java 的限制,它做得不好。所以我尝试删除我的嵌套选择。虽然这是可能的,但这意味着丑陋的冗余条件,例如:
choice()
.when(x and a)
//do stuff xa
.when(x not a)
// do other x stuff
.when(y and a)
// do y stuff
只有我的至少有另一个级别。进一步思考和回忆我读过的东西带来了第二点启示。骆驼的重点是指导路线。每个选择的 when 块应该只是将流程指向一条路线。它不应该是思考、处理或任何东西。最后,我们的小组将进行重构,以将大部分逻辑从路由构建器移除到一个 bean。我们将致力于的设计将很简单:
from(uri)
.bean(class, method) // do any processing
.choice()
.when(header("result").isEqualTo("A")
.to(routeA)
.endChoice()
.when(header("result").isEqualTo("B")
.to(routeB)
.endChoice()
.when(header("result").isEqualTo("C")
.to(route)
.endChoice()
.end()
我的建议是避免嵌套选择。特别复杂的。您可能会让它工作,但是当您以后必须进行更改时,您将无法信任它。如果您发现自己很想使用嵌套选择,请检查您要完成的任务并确定它是否真的属于路由构建器。
游戏来晚了,但可能会有所帮助。
嵌套的选择定义在 Camel 中工作得很好。只有你的终止符是错误的:
.endChoice()
--> 关闭“when”谓词.end()
--> 关闭整个“选择”块
我知道,语法有点混乱。
所以在你的情况下:
.choice()
.when(X1)
// do stuff
.choice()
.when(Y)
//do more stuff
.endChoice() // close Y condition
.end() // close inner choice block
.endChoice() // close X1 condition
.when(X2)
// do other stuff
.endChoice() // close X2 condition
.otherwise()
// default case
.endChoice() // close default condition
.end()
实际上,您不必关闭所有 when
谓词,仅针对多个子路由。以我的拙见,对缩进非常细致有很大帮助。