无法为骆驼计时器创建 MockEndpoint

时间:2021-02-23 19:12:16

标签: java apache-camel camel-test

我正在使用 Camel Timer 组件从 Azure 存储容器读取 blob。创建的路由将每 10 秒轮询一次 blob,并由 CloudBlobProcessor 处理。

from("timer://testRoute?fixedRate=true&period=10s")
    .to("azure-blob://storageAccountName/storageContainerName?credentials=#credentials")
    .to(CloudBlobProcessor)
    .to("mock:result");

我想通过创建一个类似这样的模拟端点来编写一个测试用例

MockEndpoint timerMockEndpoint = context.getEndpoint("timer://testRoute?fixedRate=true&period=10s", MockEndpoint.class);

但是,我在创建上述模拟端点时收到以下异常。

java.lang.IllegalArgumentException: The endpoint is not of type: 
class org.apache.camel.component.mock.MockEndpoint but is: org.apache.camel.component.timer.TimerEndpoint

下面是我试图跳过发送到原始端点的代码

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new AdviceWithRouteBuilder() {
  @Override
  public void configure() throws Exception {
    interceptSendToEndpoint("timer://testRoute?fixedRate=true&period=10s").skipSendToOriginalEndpoint()
        .log("Original Batch Endpoint skipped")
        .to("azure-blob://*")
        .to(CloudBlobProcessor).to("mock:result");
    from("timer://testRoute?fixedRate=true&period=10s").to("mock:result");
  }
};
}

1 个答案:

答案 0 :(得分:0)

据我所知,我们正在尝试解决两个不同的问题:

  1. MockEndpoint != TimerEndpoint
  2. 拦截

第一个答案很简单:MockEndpoints 遵循语法 mock:nameTimerEndpoint 是一个不同的端点和一个完全不同的对象。我不知道你在这里打算用 MockEndpoint 做什么,但从技术上讲,我们不能将 TimerEndpoint 对象作为 MockEndpoint 对象。为什么?因为这就是面向对象编程和 Java 的工作方式。

我们来看看第二个问题。我使用 Camel 的经验还不到一年,去年我只使用了一次拦截,但我希望我能指导你一些有用的方向。

拦截的重点是说“不要那样做,而是这样做”。在这个用例中,我们似乎只是试图跳过向 azure-blob 端点发送请求。我会尝试拦截 azure-blob://storageAccountName/storageContainerName?credentials=#credentials

所以,不是你的拦截,我会试着写一个这样的拦截:

interceptSendToEndpoint("azure-blob://storageAccountName/storageContainerName?credentials=#credentials")
    .skipSendToOriginalEndpoint()
    .log("Intercepted!");

在这种情况下,我们拦截该请求,而不是将请求发送到 azure-blob。我们告诉 Camel 跳过发送到原始端点,这意味着不会向 azure-blob://storageAccountName/storageContainerName?credentials=#credentials 发送任何内容。相反,我们将记录“拦截!”。