在 Camel SpringBoot 项目中传播请求参数值
Posted
技术标签:
【中文标题】在 Camel SpringBoot 项目中传播请求参数值【英文标题】:Propagate request param value in Camel SpringBoot project 【发布时间】:2019-08-15 10:22:14 【问题描述】:您好,我有 Spring Boot 2 项目,我正在使用骆驼作为路线。
我有一个骆驼休息端点和骆驼路线:
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
路由中第一个.to()中要设置的url值:
.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】:你必须使用http组件http://camel.apache.org/http4.html
您可以通过在消息上添加带有密钥 Exchange.HTTP_URI 的标头来覆盖 HTTP 端点 URI
.setHeader(Exchange.HTTP_URI).header("url")
.to("http4://dummy")
【讨论】:
嗯,我想做的是在 .to 中使用 url? .to($url) 像这样......当我放它时,我总是得到错误,比如找不到端点等等 如果您将“url”查询参数添加到 Exchange.HTTP_URI 标头,然后使用 http4 组件调用 .to,它应该在“url”标头/查询参数中调用端点。试一试 我得到:没有找到带有方案的组件:http4 即使我添加了camel-http4依赖... 我修复了 http4.x 的问题。现在,当我发送请求时,我收到了只有假人的错误......我可以用什么代替假人?我试过 $url 但没有帮助... 当我删除它时,我得到:如果您正在转发/桥接 http 端点,则在端点上启用 bridgeEndpoint 选项:http4://dummy【参考方案2】:试试这个
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");
【讨论】:
有了这个我也可以改变activemq参数?以上是关于在 Camel SpringBoot 项目中传播请求参数值的主要内容,如果未能解决你的问题,请参考以下文章
springboot 整合 apache camel实现企业级数据集成和处理
springboot 整合 apache camel实现企业级数据集成和处理
Apache Camel 与 Spring Boot 集成,通过FTP定时采集处理文件