Java ApacheCamel(此处使用哪个EIP?)使用重复的头数据聚合/丰富所有行
我处理的CSV格式如下:Java ApacheCamel(此处使用哪个EIP?)使用重复的头数据聚合/丰富所有行,java,apache-camel,eip,Java,Apache Camel,Eip,我处理的CSV格式如下: 01,H2,H3 02,B2,B3,B4,B5 02,B2,B3,B4,B5 02,B2,B3,B4,B5 02,B2,B3,B4,B5 01,H2,H3 02,B2,B3,B4,B5 02,B2,B3,B4,B5 01,H2,H3 02,B2,B3,B4,B5 02,B2,B3,B4,B5 02,B2,B3,B4,B5 01指定标题行,02指定正文行 我需要获取标题数据并将其添加到正文消息中,以便最终发送如下消息: H2,H3,B2,B3,B4,B5 H2,H3,B
01,H2,H3
02,B2,B3,B4,B5
02,B2,B3,B4,B5
02,B2,B3,B4,B5
02,B2,B3,B4,B5
01,H2,H3
02,B2,B3,B4,B5
02,B2,B3,B4,B5
01,H2,H3
02,B2,B3,B4,B5
02,B2,B3,B4,B5
02,B2,B3,B4,B5
01指定标题行,02指定正文行
我需要获取标题数据并将其添加到正文消息中,以便最终发送如下消息:
H2,H3,B2,B3,B4,B5
H2,H3,B2,B3,B4,B5
H2,H3,B2,B3,B4,B5
我已经尝试过聚合,但在这种情况下,这似乎不是正确的EIP,因为我只是一次又一次地将同一条消息合并,而不是将多条消息合并为一条。。。在基本层面上,我需要访问头数据以处理主体(实际上,它只是一个字段)。我只是不知道如何设置一个变量,因为每次交换都会清除头和属性。有什么建议吗?提前谢谢。让我知道看一下骆驼路线是否有帮助
以下是骆驼路线,可能会有所帮助:
from("direct:inventory")
.split(body().tokenize("\n")).streaming()
.throttle(100)
.choice()
.when(property("CamelSplitComplete").isEqualTo(true))
.log("Processed ${property.CamelSplitSize} updates")
.end()
.unmarshal(csv)
.log("${body}")
.aggregate(header("CamelFileLastModified"), new InventoryAggregationStrategy())
.completionPredicate(header("aggregationComplete").isEqualTo(true))
.to("freemarker://templates/inventory.ftl")
.unmarshal().string("UTF-8")
.unmarshal().json(JsonLibrary.Jackson)
.convertBodyTo(JsonObject.class)
.to("endpoint");
您始终可以使用简单的方法并使用bean
public class CamelHeadersAndRows {
public static class HeaderBean {
String header = null;
public void setHeader(String body) {
header = body.substring("01,".length());
}
public String useHeader(String body) {
return header + "," + body.substring("02,".length());
}
}
public static void main(String[] args) throws Exception {
final HeaderBean headerBean = new HeaderBean();
Main camelMain = new Main();
camelMain.addRouteBuilder(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("timer:foo?period=1s&repeatCount=1")
.setBody(constant(
"01,H2,H3\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5\n" +
"01,H2,H3\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5\n" +
"01,H2,H3\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5\n" +
"02,B2,B3,B4,B5"
))
.to("direct:inventory");
from("direct:inventory")
.split(body().tokenize("\n")).streaming()
.choice()
.when().simple("${body} regex '^01.*'")
.bean(headerBean, "setHeader")
.stop()
.otherwise()
.bean(headerBean, "useHeader")
.end()
.log("message: ${body}")
;
}
});
camelMain.run();
}
}
老实说,我没有得到解释。我想看到这条路线将有助于理解您的问题。我同意Sergey的意见。我不太清楚您的意思,但我怀疑您正在寻找转换/翻译类型的EIP。聚合模式似乎不是正确的选择。可能会显示使用一些例子,而不仅仅是概念。如果看到路线和数据规格表帮助,请告诉我,谢谢!太棒了,这看起来很完美。现在的问题是正则表达式与01不匹配?认为这可能与需要缓存流有关?我不确定。我试图匹配的行中没有可见的空白。您好,字符串中可能有其他字符,或者编码有问题。打印出来(
.log(${body})
)时会发生什么?或者您可以在bean中设置一个调试点并检查该值吗?我最后只是在bean中使用一些逻辑来检查并在它检测到头行或正文行时采取适当的操作。我能够将“bean”合并成一个函数,我相信现在从技术上讲它不再是bean了,但它可以工作!再次感谢你的帮助。很高兴听到这个消息!不用担心:)