我在这里发现了两个问题,询问Camel的.end()和.endChoice()之间的区别。这对我来说不是问题。对我来说很清楚,.end()用于完成.choice()块,而.endChoice()用于完成.when()块。
然而,我的问题是......到底使用.endChoice()有什么意义呢?仅仅是为了让代码更清晰吗?
看看这些例子(请不要指出它的正确性或可用性,我在这里的重点是理解机制,而不是要求干净的代码模型):
代码示例1:
from("file:files/input")
.choice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 1")
.choice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 1 nested")
.endChoice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 2 nested")
.endChoice()
.endChoice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 2")
.endChoice()
.otherwise()
.log("NOT AN XML FILE")
.end().to("file:files/output");
代码示例2:
from("file:files/input")
.choice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 1")
.choice()
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 1 nested")
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 2 nested")
.when(simple("${file:ext} ends with 'xml'"))
.log("LOG 2")
.otherwise()
.log("NOT AN XML FILE")
.end().to("file:files/output");
我测试了将xml文件放到files文件夹中,两个代码做的事情完全相同。无论是否使用.endChoice()s,.when()s总是表现为“elseif”语句,即响应是“LOG 1”和“LOG1 nested”,而“LOG2”和“LOG 2 nested”永远不会打印。如果文件不是xml,则会按预期触发其他路由。
希望我问的是清楚的。最好的问候。
1条答案
按热度按时间fdx2calv1#
.endChoice
只是弥补Camel DSL限制的一种解决方法。您的示例运行良好,因为您的when块的内容非常简单。如果您将更复杂的EIP放入其中,您可能会遇到这样的情况:如果没有
.endChoice
,您的代码将无法编译。请看thisexample on the Camel website中的例子。
我也遇到过
.endChoice
也不起作用的情况,但通常在这种情况下,路径太复杂了,应该被拆分。