Как получить заголовки с одного маршрута на другой маршрут — Camel JavaDSL

#spring-boot #apache-camel #spring-camel

#spring-boot #apache-camel #spring-camel

Вопрос:

У меня есть конечная точка camel rest с двумя параметрами, и когда я отправляю запрос, он активирует первый маршрут («direct: amq»), где я получаю сообщение от ActiveMQ.

Заголовки здесь в порядке, но этот маршрут активирует другой маршрут («direct: post)», и заголовки там отсутствуют.

Я хочу получить заголовок urlToPost с первого маршрута на второй.

  rest("/getFromActiveMq").produces("application/json")
    .get()
    .param()
    .name("urlToPost")
    .type(RestParamType.query)
    .dataType("String")
    .endParam()
    .param()
    .name("getactivemq")
    .type(RestParamType.query)
    .dataType("String")
    .endParam()
    .to("direct:amq");

from("direct:amq").streamCaching()
    .startupOrder(2)
    .log("My activemq is "   "${in.header.getactivemq}")
    .log("My urlToPost is "   "${in.header.urlToPost}")
    .setHeader("myHeader")
    .header("${in.header.urlToPost}")
    .log("My urlToPost Changed header is "   "${header.myHeader}")
    .process(exchange -> {
      String header = exchange.getIn().getHeader("urlToPost", String.class);
      System.out.println(header);
      exchange.getIn().setHeader("myShittyHeader", header);

      Map<String, Object> hdr = exchange.getIn()
          .getHeaders();
      for (Map.Entry<String, Object> entry : hdr.entrySet()) {
        System.out.println(entry.getKey()   "/"   entry.getValue());
      }
    })
    .pollEnrich()
    .simple("activemq://${in.header.getactivemq}")
    .onCompletion()
    .log("My body is : "   "${body}")
    .to("direct:post");

from("direct:post").tracing()
    .process(exchange -> exchange.getIn()
        .setBody(exchange.getIn()
            .getBody()))
    .convertBodyTo(String.class)
    .process(exchange -> {
      Map<String, Object> hdr = exchange.getIn()
          .getHeaders();
      for (Map.Entry<String, Object> entry : hdr.entrySet()) {
        System.out.println(entry.getKey()   "/"   entry.getValue());
      }
    })
    .log("My urlToPost BEFORE SETTING HEADERS is "   "${in.header.urlToPost}")
    .setHeader("Content-Type", constant("application/json"))
    .setHeader("Accept", constant("application/json"))
    .setHeader(Exchange.HTTP_METHOD, constant("POST"))
    .log("My urlToPost AFTER SETTING HEADERS is "   "${in.header.urlToPost}")
    // .log("My HTTP_URI is: "   "${in.header.urlToPost}")
    // .to("http4://urlToPost")
    // .to("direct:nothing");
    .enrich()
    .simple("http4://urlToPost");
  

Я обнаружил, что после:

.pollEnrich() .simple(«activemq://${in.header.getactivemq}»)

Заголовки исчезли

Ответ №1:

pollEnrich объединяет ваш текущий Exchange с другим сообщением. Это означает, что это фактически агрегатор.

Если вы не предоставляете стратегию агрегирования, Camel использует по умолчанию простое объединение тела. Это причина, по которой вы теряете свои заголовки.

Вы должны настроить уже существующую или реализовать свою собственную стратегию агрегирования, которая учитывает заголовки одного или обоих сообщений во время агрегации.