【问题标题】:How to set header on Apache Camel 3.X.X route?如何在 Apache Camel 3.X.X 路由上设置标头?
【发布时间】:2021-08-25 15:27:30
【问题描述】:

我正在对 Camel 路线进行集成测试。

骆驼路线:

from("direct:abc")
  .routeId("abc-route")
  .process(MyProcessor())
  .toD("direct:xyz")

由于这条路线正在被隔离测试,我需要在测试中设置标题;以前,他们是从另一条路线到达的。我该怎么做?

简化测试类:

@SpringBootTest
@MockEndpoints
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
class MyRouteTest {

  @Autowired
  lateinit var camelContext: CamelContext

  @Produce(uri = "direct:abc")
  lateinit var template: ProducerTemplate

  @EndpointInject(uri = "mock:direct:xyz")
  lateinit var destEndpoint: MockEndpoint

  @Test
  fun `should test route`() {
    template.sendBody("")
  }
}

我已经尝试过camelContext.adapt(ModelCamelContext::class.java),但仍然无法到达路线并强行修改它。

【问题讨论】:

  • ProducerTemplate 有几种方法可用于发送带有标题的正文。即template.sendBodyAndHeaders(...) 或单个标头template.sendBodyAndHeader(...)。您还可以编织路线并添加 .setHeader("headerName", constant(value)) 或使用 .setHeader("headerName", simple(expression)) 代替常量值来添加简单语言评估值

标签: spring-boot kotlin testing apache-camel


【解决方案1】:

尽管已经在 cmets 中回答了,但我认为这个问题值得回答。

ProducerTemplate interface 有许多不同的方法可以将 Camel Exchange 发送到 Camel 端点。

有一些方法可以只发送消息正文、具有一个或多个标头的正文或具有一个或多个 Exchange 属性的正文。

还有一个fluent interface,可用于以良好的描述性方式自定义 Exchange。

来自 Camel Docs 的示例:

Integer result = FluentProducerTemplate.on(context)
    .withHeader("key-1", "value-1")
    .withHeader("key-2", "value-2")
    .withBody("Hello")
    .to("direct:inout")
    .request(Integer.class);

【讨论】:

  • 无法使用生产者模板时的 routeID。我遇到了一个问题,我的 from in 路由取决于生产者模板传递的标头或 .有没有关于如何实施相同的建议。
  • routeId 是路由的静态标识符(用于记录等)。如果你不设置一个,Camel 只会使用 route-1、route-2 或类似的。 routeId 在创建路由时设置,不能更改。您不能将每条消息都不同的动态值用作 routeId。还是我误解了你的评论?
  • 我在这里问了我的问题。你能检查一下吗。链接stackoverflow.com/questions/70960478/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
相关资源
最近更新 更多