1

我很好奇如何在 Apache Camel 中管理 HTTP REST 请求?

我需要遍历 ID 列表并将列表中的特定 ID 放入 HTTP GET 请求中。我将从数据库中收到此列表。我需要向第三方服务器发送请求并管理响应 - 将其插入数据库。

如何在循环内的请求中计划 ID 参数?

@Component
    public class EgrRegistryNumbersRoute
          extends RouteBuilder {
        private final JacksonDataFormat format = new ListJacksonDataFormat(NumbersDTO.class);
        @Autowired
        DataSource dataSource;

List myList = List.of(1, 2, 3, 4, 5);
        
        @Override
        public void configure() throws Exception {
            from("timer://foo?repeatCount=1")
                  .noAutoStartup()
                  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
                  .to("http://server/api/v2/getRegNumByState/**{HERE I WANT VALUE FROM THE LIST}**")
                  .unmarshal(format)
                  .routeId("NumbersRoute-route")
                  .log(">>>${body}")
                  .process(new InsertProcessor("table_name", "column"))
                  .to("jdbc:dataSource");
        }
    }

处理器:

public class InsertProcessor
      implements Processor {
    private final String tableName;
    private final String columns;
    
    public InsertProcessor(String tableName, String columns) {
        this.tableName = tableName;
        this.columns = columns;
    }
    
    @Override
    public void process(Exchange exchange) throws Exception {
        List<NumbersDTO> inputList = exchange.getIn().getBody(List.class);
        StringBuilder queryBuilder = new StringBuilder("INSERT INTO " + tableName + "(" + columns + ") values ");
        System.out.println("Input to be persisted : " + inputList);
        
        inputList.forEach(v -> {
            queryBuilder.append("(").append(v.getNgrn()).append("),");
        });
        String insertQuery = queryBuilder.toString().replaceFirst(".$","");
        System.out.println("Insert Query is : " + insertQuery);
        exchange.getIn().setBody(insertQuery);
    }
}
4

1 回答 1

2

您可以使用split并在定义 http 生产者端点时切换到来to实现此目的。toD有了toDURI,您就可以使用简单的语言。

from("direct:queryRestWithURI")
    .setBody(constant(myList))
    .split(body())
        .toD("http://server/api/v2/getRegNumByState/${body}")
        //do stuff
    .end();

如果您不想使用拆分器,您也可以使用循环来遍历列表。

from("direct:queryRestWithURI")
    .routeId("NumbersRoute-route")
    .setBody(constant(myList))
    .loop(simple("${body.size()}"))
        .setHeader("loopItem", simple("${body[${exchangeProperty.CamelLoopIndex}]}"))
        .toD("http://server/api/v2/getRegNumByState/${headers.loopItem}")
        // do stuff
    .end();
于 2021-08-10T17:56:38.287 回答