#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