1

我正在使用 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");
  }
};
}
4

1 回答 1

0

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

  1. 模拟端点!= 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. 相反,我们将记录“Intercepted!”。

于 2021-03-02T11:58:46.257 回答