【问题标题】:Apache camel Restlet producer cached缓存的 Apache 骆驼 Restlet 生产者
【发布时间】:2018-07-28 09:13:46
【问题描述】:

我使用的是 camel 2.18.0 版本。我在 SEDA 流程中使用 restlet 组件时遇到问题。请在下方查看路线详情

from("timer://foo?repeatCount=1")
.to("http4://localhost:8080/pages")
.split(body())
.to("seda:pageConsumer");

from("seda:pageConsumer?concurrentConsumer=5")
.toD("restlet:${in.body}")
.process(enrich());

路线详情:

问题:

当 seda 端点收到第一个 URL 时,一切正常,即“http://localhost:8080/data?page=1&size=5”rest 端点由 restlet 调用,并在路由中处理预期数据。

当 seda 端点接收到第二个 URL 时,即 "http://localhost:8080/data?page=2&size=5" ,这是问题开始的地方,而不是使用 "page=2&size=5" 作为查询参数调用 rest 端点,restlet 使用来自第一个 URL 的查询参数,即 "page=1&size=5"。其余网址的问题仍在继续。

调试后发现camel在ProducerCache中缓存producer 生产者缓存在以端点 uri 为键的 hashmap 中。

问题为什么骆驼在缓存期间不尊重查询参数?为什么要避免缓存?

请注意,我通过更改 url 以包含丑陋的页面详细信息来使代码正常工作。目前网址看起来像 http://localhost:8080/data/page/2/size/5.

【问题讨论】:

  • 尝试禁用流缓存并进行测试。 from("seda:pageConsumer?concurrentConsumer=5").noStreamCaching().toD("restlet:${in.body}").noStreamCaching()......
  • 如果在拆分器中使用流选项会怎样?

标签: apache-camel


【解决方案1】:

如果restlet 端点调用相同的http url(例如host:port),那么最好使用一个普通的to 和这个host:port 作为静态,然后用动态部分设置一个标头。

.setHeader(Exchange.HTTP_QUERY, constant("page1=&size=5"))
.to("http:xxxx")

然后重复使用相同的端点/生产者,然后标头包含带有查询参数的动态部分。

还有一个标题,您可以在其中设置上下文路径以及Exchange

如果您继续使用toD,那么您可以使用cacheSize 选项调整缓存的大小 - 与收件人列表中的相同:http://camel.apache.org/recipient-list.html

【讨论】:

  • 感谢克劳斯易卜生的解决方案。我正在使用restlet,因为休息服务返回一个流。我没有找到使用 http4 或 http 协议消耗流的方法。有没有办法在 restlet 中动态设置 HTTP_QUERY 部分?或者有没有更好的方法来使用在上述路由中返回流的休息服务,即在 seda 路由内部。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多