【问题标题】:Camel Rest to dB Query, returning incorrect responseCamel Rest to dB Query,返回不正确的响应
【发布时间】:2019-08-27 09:11:05
【问题描述】:

我正在尝试从休息调用接收 xml 消息,然后调用数据库,将每一行映射到一个对象,然后返回完整的编组对象作为休息响应。

但是,即使在最后一个进程执行之前,我的数据库查询结果也会作为剩余响应返回。您能否告知我是否做错了什么导致返回 dB 查询?

如果我的解决方案是正确的方法,还请告知,因为真正的数据库查询将有大约 25000 行,我担心我的网络服务超时。

路线:

        from("jetty://http://localhost:8888/...")
                .log("Message Received")
                .setExchangePattern(ExchangePattern.InOut)
                .unmarshal(soapMessage)
                .removeHeaders("CamelHttp")
                .to("direct:ProcessRequest");

        from("direct:ProcessRequest")
           .setBody(constant("SELECT * FROM table"))
           .to("jdbc:dataSource").split(body()).parallelProcessing()
           .process(rowProcessor)
           .aggregate(constant(true), new ArrayListAggregationStrategy())
            .completionFromBatchConsumer()
            .process(combinedProcess)


行处理器

        RowResult rowResult = new RowResult();

        Map<String, Object> row = exchange.getIn().getBody(Map.class);
        System.out.println("Processing " + row);
        rowResult.setName((String) row.get("name"));
        rowResult.setSurname((String) row.get("surname"));

        exchange.getIn().setBody(responserowResultDetail);

组合过程

        System.out.println("Bulk process");
        People people = new People();

        List<rowResult>  rowResults = (List<rowResult>)exchange.getIn().getBody();

        people.getEveryone().addAll(rowResults);


        exchange.getIn().setBody(people);
        exchange.getIn().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_XML);

我从休息响应中得到以下信息:

[{id=1, name = test ...... }]

【问题讨论】:

    标签: java spring-boot apache-camel spring-camel camel-sql


    【解决方案1】:

    我认为您的 direct:ProcessRequest 线程正在做它应该做的事情 - 即它正在返回进入拆分的内容,因为您没有与拆分相关联的聚合策略。我认为你需要做的是让拆分来进行聚合,然后它就会起作用。我没有测试过这个,但我认为你需要这样的东西:

        from("direct:ProcessRequest")
           .setBody(constant("SELECT * FROM table"))
           .to("jdbc:dataSource")
           .split(body(), new ArrayListAggregationStrategy() )
               .parallelProcessing()
               .process(rowProcessor)
           .end()
           .completionFromBatchConsumer()
           .process(combinedProcess)
    

    【讨论】:

    • 我的聚合有效。但是我的问题是返回到 rest 调用的响应是 db 查询返回的列表,而不是我在 combineProcess 中设置的主体
    • 问题是如果你没有在split中指定聚合策略,那么split会返回它收到的原始消息。因此,从direct:ProcessRequestfrom("jetty... 返回的是传递到拆分器的原始消息。请参阅拆分器文档中的camel.apache.org/manual/latest/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2016-10-13
    • 2023-02-17
    • 2021-07-19
    • 2017-08-10
    相关资源
    最近更新 更多