当前位置: 首页 > 知识库问答 >
问题:

Apache camel(此处使用哪个EIP?)使用重复的标题数据聚合/丰富所有行

公孙锋
2023-03-14

我有一个正在处理的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,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");

这是数据的规格

共有1个答案

祁晟
2023-03-14

您可以使用简单的方法并使用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();
    }

}
 类似资料:
  • 我有一个RESTful Webservice,我想在骆驼路上用它来丰富内容。参见类似的代码: 如果我运行这个,我会得到以下错误: < code >没有类型转换器可用于从type: de.my.Class转换为所需的type: java.io.InputStream,值为de.my.Class@620ee765。 在我看来,他试图将 Exchange 的主体发送到 http-Endpoint,尽管我

  • 我不确定这是否可能,但我在安装Laravel时遇到了这种情况。 我正在运行3个实时数据库(随着时间的推移会更多),我有一个laravel安装,我想做的是使用不同的连接合并所有数据,并运行1个查询,以获得所有关系等所有数据使用雄辩。所有的数据库在表设计、索引、键等方面都是一样的,但我不确定是否可能! 我希望能够编写一个查询,例如:

  • 我正在编写一个Flink流程序,其中我需要使用一些静态数据集(信息库,IB)来丰富用户事件的数据流。 对于例如。假设我们有一个买家的静态数据集,并且我们有一个事件的clickstream,对于每个事件,我们要添加一个布尔标志,指示事件的实施者是否是买家。 另一个选择可以是使用托管操作员状态来存储购买者设置,但是我如何保持按用户id分配的该状态,以避免在单个事件查找中使用网络I/O呢?在内存状态后端

  • 问题内容: 我是Node.js的新手,已经提出了使用Node.js开发基于富Web的应用程序的要求。 现在,我正在研究node.js的入门指南。我有机会在这里查看页面,并对数百个框架感到困惑。我不知道如何选择合适的框架,因此需要帮助以做出完美的决定。让我解释一下我的要求。 想要为所有功能开发RESTfull API。(是否有OAuth图书馆?) 想要在API之上开发Web应用程序。必须以某种方式设

  • 数据丰富是指用于增强,改进和改进原始数据的一系列过程。 它指的是有用的数据转换(原始数据到有用信息)。 数据丰富过程的重点是使数据成为现代企业或企业的宝贵数据资产。 最常见的数据丰富过程包括通过使用特定的决策算法来纠正数据库中的拼写错误或印刷错误。 数据丰富工具为简单数据表添加有用信息。 考虑以下代码进行单词拼写纠正 - import re from collections import Coun

  • 我试图在聚合器完成后获得一个回复,但是我得到一个异常,我没有指定任何聚合器子项,但是当我指定一个。to()endpoint我没有收到聚合结果。。。这可能吗? 控制器: 聚合器: