可以初始化一个 bindy(Apache Camel DataFormat - FixedLength 并在同一路线中使用它
Possible to initialize a bindy (Apache Camel DataFormat - FixedLength and use it in the same route
我的输入文件由多种类型的 FixedLengthRecord 组成,所以我有很多 FixedLengthDataFormat 来解组每个 post。
- 我每行拆分正文
- 首先我应该意识到我应该使用哪种数据格式,然后创建一个对象
- 然后解组
像这样的:
from(myURI)
.split().tokenize("\n")
.process(initializeMyBindyDataFormat)
.unmarshal(bindy)
.end();
但我的问题是,当我通过进程初始化绑定对象时,我得到了 NPE。
但是,如果我在我的路由定义之前(在 from 之前)创建一个 bindy 对象,它就可以正常工作。我的 bindy 对象依赖于主体,我无法在路由定义之前对其进行初始化。
实际上 Apache Camel 在启动路由之前处理 bindy 对象的初始化
在这种情况下,我认为最好将您的处理分成两个 seps。
接收不同数据的主路由。在这里,您定义谓词规则来确定它是哪种 body。检查 body 的开头,或确定它属于这种或那种类型的东西。添加一个 choice() when() 并根据哪个谓词设置为 true 将其设置为单独的路由。
在辅助路由中添加特定的绑定格式并执行您的 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();
答案是使用.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 的帮助。
我的输入文件由多种类型的 FixedLengthRecord 组成,所以我有很多 FixedLengthDataFormat 来解组每个 post。
- 我每行拆分正文
- 首先我应该意识到我应该使用哪种数据格式,然后创建一个对象
- 然后解组
像这样的:
from(myURI)
.split().tokenize("\n")
.process(initializeMyBindyDataFormat)
.unmarshal(bindy)
.end();
但我的问题是,当我通过进程初始化绑定对象时,我得到了 NPE。 但是,如果我在我的路由定义之前(在 from 之前)创建一个 bindy 对象,它就可以正常工作。我的 bindy 对象依赖于主体,我无法在路由定义之前对其进行初始化。 实际上 Apache Camel 在启动路由之前处理 bindy 对象的初始化
在这种情况下,我认为最好将您的处理分成两个 seps。
接收不同数据的主路由。在这里,您定义谓词规则来确定它是哪种 body。检查 body 的开头,或确定它属于这种或那种类型的东西。添加一个 choice() when() 并根据哪个谓词设置为 true 将其设置为单独的路由。
在辅助路由中添加特定的绑定格式并执行您的 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();
答案是使用.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 的帮助。