Распространение значения параметра запроса в проекте Camel SpringBoot

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

#весенняя загрузка #apache-camel #spring-camel

Вопрос:

Здравствуйте, у меня есть проект Spring Boot 2, и я использую camel для маршрутов.

У меня есть конечная точка camel rest и маршрут Camel:

  rest("/").produces("application/json")
.get("hello")
.param().name("url").type(RestParamType.query)
.dataType("String").endParam()
.to("direct:hello");
/////////////////////////////////////////////    
  System.out.println("starterd");
boolean startupRoute = true;
from("direct:hello").autoStartup(startupRoute)
    .tracing()
    .streamCaching()
    .process(exchange -> exchange.getIn()
        .setBody(exchange.getIn()
            .getBody()))
    .convertBodyTo(String.class)
    .marshal()
    .json(JsonLibrary.Jackson)
    .setHeader("Content-Type", constant("application/json"))
    .setHeader("Accept", constant("application/json"))
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.HTTP_URI).header("url")
    .log(LoggingLevel.INFO, "${body}")
    .removeHeader(Exchange.HTTP_PATH)
    .to("http4://url")
    .log(LoggingLevel.INFO, "This is my body: ${body}")
    .to("activemq://hello?exchangePattern=InOnly");
System.out.println("finished");
  

Что я хочу сделать, так это когда я отправляю запрос, подобный этому:

http://localhost:8080/camel/hello/?url=http://localhost:8081/hi

Значение URL должно быть установлено в первом .to() в маршруте:

.to(«{url}?bridgeEndpoint=true»)

Я также пробовал использовать контроллер spring boot rest, но у меня все еще возникают проблемы с получением значения параметра в .to (${url}

 @GetMapping(value = "/finally")
  public String sendFromEndpointToActiveMq(@RequestParam(value = "url") String url) throws Exception {

  producerTemplate.sendBody("direct:hello", url);

return "done";
  

РЕДАКТИРОВАТЬ: я отредактировал маршрут

Ответ №1:

Попробуйте с этим

 System.out.println("starterd");
boolean startupRoute = true;
from("direct:hello").autoStartup(startupRoute)
    .tracing()
    .streamCaching()
    .process(exchange -> exchange.getIn()
        .setBody(exchange.getIn()
            .getBody()))
    .convertBodyTo(String.class)
    .marshal()
    .json(JsonLibrary.Jackson)
    .setHeader("Content-Type", constant("application/json"))
    .setHeader("Accept", constant("application/json"))
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.HTTP_URI)
    .header("url")
    .log(LoggingLevel.INFO, "${body}")
    .removeHeader(Exchange.HTTP_PATH)
    .to("http4://url")
    .to("direct:hi");

from("direct:hi").log(LoggingLevel.INFO, "This is my body: ${body}")
    .recipientList(simple("activemq://${header.activemq}" "?exchangePattern=InOnly"));
System.out.println("finished");
  

Комментарии:

1. С помощью этого я тоже могу изменить параметр activemq?

Ответ №2:

Вы должны использовать http-компонент http://camel.apache.org/http4.html

Вы можете переопределить URI конечной точки HTTP, добавив заголовок с ключом Exchange.HTTP_URI в сообщении

 .setHeader(Exchange.HTTP_URI).header("url")
.to("http4://dummy")
  

Комментарии:

1. Хм, то, что я хочу сделать, это использовать URL в .to? .to(${url}) вот так… И когда я его помещаю, я всегда получаю сообщение об ошибке, например, не удалось найти конечную точку и т. Д

2. если вы добавите параметр запроса ‘url’ в заголовок Exchange.HTTP_URI и затем вызовете . чтобы с помощью компонента http4 вызвать конечную точку в заголовке url / параметре запроса. попробуйте

3. Я получаю: компонент не найден со схемой: http4, хотя я добавил зависимость camel-http4…

4. Я исправил проблему с http4. Теперь, когда я отправляю запрос, я получаю ошибку только с фиктивным значением… Что я могу поместить вместо dummy? Я пробовал с помощью $ {url}, но это не помогло…

5. Когда я удаляю его, я получаю: Если вы пересылаете / соединяете конечные точки http, тогда включите параметр bridgeEndpoint на конечной точке: http4: //dummy