可以初始化一个 bindy(Apache Camel DataFormat - FixedLength 并在同一路线中使用它

Possible to initialize a bindy (Apache Camel DataFormat - FixedLength and use it in the same route

我的输入文件由多种类型的 FixedLengthRecord 组成,所以我有很多 FixedLengthDataFormat 来解组每个 post。

  1. 我每行拆分正文
  2. 首先我应该意识到我应该使用哪种数据格式,然后创建一个对象
  3. 然后解组

像这样的:

from(myURI)
    .split().tokenize("\n")
        .process(initializeMyBindyDataFormat)
        .unmarshal(bindy)
    .end();

但我的问题是,当我通过进程初始化绑定对象时,我得到了 NPE。 但是,如果我在我的路由定义之前(在 from 之前)创建一个 bindy 对象,它就可以正常工作。我的 bindy 对象依赖于主体,我无法在路由定义之前对其进行初始化。 实际上 Apache Camel 在启动路由之前处理 bindy 对象的初始化

在这种情况下,我认为最好将您的处理分成两个 seps。

  1. 接收不同数据的主路由。在这里,您定义谓词规则来确定它是哪种 body。检查 body 的开头,或确定它属于这种或那种类型的东西。添加一个 choice() when() 并根据哪个谓词设置为 true 将其设置为单独的路由。

  2. 在辅助路由中添加特定的绑定格式并执行您的 marshal/unmarshal 工作。

文档中的示例:

Predicate isWidget = header("type").isEqualTo("widget");
from("jms:queue:order")
   .choice()
      .when(isWidget).to("bean:widgetOrder")
      .when(isWombat).to("bean:wombatOrder")
   .otherwise()
      .to("bean:miscOrder")
   .end();  

http://camel.apache.org/predicate.html

答案是使用.inout 因为我想在另一条路线上解组,一个简单的例子应该如下:

from(myURI)
    .split().tokenize("\n")
        .inout("direct:unmarshalSpecificRow")
    .end();

from(direct:unmarshalSpecificRow")
    .choice()
        .when(firstPredicate)
           unmarshal(new BindyFixedLengthDataFormat(package1)
        .when(secondPredicate)
           unmarshal(new BindyFixedLengthDataFormat(package1)
        .when(thirdPredicate)
           unmarshal(new BindyFixedLengthDataFormat(package1)
        .otherwise()
           .throwException(new IllegalArgumentException("Unrecognised post")
    .end();

感谢 jakub-korab 的帮助。