首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Camel end vs endChoice -不是通常的查询

Camel end vs endChoice -不是通常的查询
EN

Stack Overflow用户
提问于 2015-09-04 01:49:28
回答 2查看 15.6K关注 0票数 19

首先,是的,我已经搜索过了,并且,是的,我已经阅读了每个人都指向的相同的Apache文档。:-)我认为有一点混乱,我想我知道答案,所以让我举一个我认为正确的例子,跟随我认为答案是什么。谢谢。哦,我确实知道有些endChoice()行并不是绝对必要的,Camel会解决这个问题的,但我喜欢清晰地描述这些块,除非有什么理由不使用它们。

代码语言:javascript
运行
复制
.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的看法是,endChoice()是用来关闭像choice和split这样的东西,而end()是用来关闭像何时和其他时候这样的选项。它看起来更像是一个返回ChoiceDefinition的end()。这会让名字更好听一点。

但是,如果我去掉了标记为“close inner block”的end(),这意味着我继续到下一行,一个endChoice()。这会关闭内部的选择块吗?鉴于此,when(X2)仍然在when(X1)块中。因此,我认为我需要用endChoice()代替end(),而不是删除它。因此结果将如下所示:

代码语言:javascript
运行
复制
.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中处理这个问题的方法吗?或者,有没有一种更简单的方式,我只是错过了?耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-15 02:13:35

简短的回答:,我会在这个问题上给自己打电话,这样其他人就不会这样做了,答案是你做错了,不应该有嵌套的选择。

长长的回答:我继承了一个复杂的路线构建器,并试图将其清理干净,使其更清晰。但是,拉直和放入end()或endChoice()只会破坏一些东西。而且,是的,上面的修复仍然破坏了一些东西。我不明白Camel是怎么知道去哪个街区的。研究和尝试寻找嵌套的好例子最终使人们认识到,Camel是,而不是真正为嵌套选择而设计的。它允许这样做,但由于Java的限制,它没有很好地做到这一点。所以我试着删除我的嵌套选择。虽然这是可能的,但它将意味着丑陋的冗余条件,例如:

代码语言:javascript
运行
复制
choice()
  .when(x and a)
    //do stuff xa
  .when(x not a)
    // do other x stuff
  .when(y and a)
    // do y stuff

只有我的才会有至少另一个层次。进一步的思考和回忆我读过的东西带来了第二点启示。Camel的全部意义在于指导路线。每个选项的when块应该只是将进程指向一个路由。它不应该是思考、处理或任何事情。最后,我们的团队将进行重构,将大部分逻辑从路由构建器中删除到bean中。我们将致力于的设计将是简单的:

代码语言:javascript
运行
复制
   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()

我给你的建议是避免嵌套选择。特别复杂的问题。您可能会让它工作,但当您以后必须进行更改时,您将无法信任它。如果你发现自己尝试使用嵌套选择,检查你试图实现的目标,并确定它是否真的属于路线构建器。

票数 24
EN

Stack Overflow用户

发布于 2020-12-08 06:29:08

在游戏中来晚了,但可能会有帮助。

嵌套的选择定义在Camel中工作得很好。只有你的终结符是错的:

  • .endChoice() -->关闭"when“predicate
  • .end() -->关闭整个”

“块

我知道,语法有点混乱。

所以在你的例子中:

代码语言:javascript
运行
复制
.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谓词,只需关闭多个子路由。在我的浅见中,对缩进的超级细致会有很大帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32382322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档