在 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定时采集处理文件

SpringBoot Camel SendBody() 路由不发送

springboot怎么启动项目

Camel Rest XML DSL分离文件夹结果Unmarshall Exception