0

我的输入文件包含几种类型的 FixedLengthRecord,所以我有很多 FixedLengthDataFormat 来解组每个帖子。

  1. 我每行拆分身体
  2. 首先我应该意识到我应该使用哪个 DataFormat,然后创建一个对象
  3. 然后解组

像这样的东西:

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

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

4

2 回答 2

1

答案是使用 .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的帮助。

于 2016-03-24T05:29:58.057 回答
0

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

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

  2. 在辅助路由中添加特定的绑定格式并进行编组/解组工作。

文档中的一个示例:

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

于 2016-02-25T08:08:50.410 回答