骆驼结束与结束选择 - 不是通常的查询

2022-09-02 03:26:28

首先,是的,我已经搜索过了,是的,我阅读了每个文档指向的同一个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()用于关闭选择选项,如何时和其他。看起来后者实际上是返回 ChoiceDefinition 的 end()。这使得这个名字更好一点。

但是,如果我去掉标记为“关闭内部选择块”的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

那么,这是在骆驼中处理这个问题的方法吗?还是有更简单的方法让我错过了?感谢您抽出宝贵时间接受采访。


答案 1

简短的回答:我会就此呼吁自己,这样其他人就不必这样做了,答案是你做错了,不应该有嵌套的选择。

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

choice()
  .when(x and a)
    //do stuff xa
  .when(x not a)
    // do other x stuff
  .when(y and a)
    // do y stuff

只有我的至少还有另一个层次。进一步思考和回忆我读过的东西带来了第二点启示。骆驼的全部意义在于指导路线。每个选择的何时块应该只是将过程指向路由。它不应该是思考,处理或任何东西。最后,我们小组将进行重构,以删除从路由生成器到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()

我对你的建议是避免嵌套选择。特别复杂的。您可能会让它正常工作,但是当您以后必须进行更改时,您将无法信任它。如果您发现自己想使用嵌套选项,请检查您要完成的任务,并确定它是否真的属于路线构建器。


答案 2

在游戏后期出现,但可能会有所帮助。

嵌套选项定义与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


推荐