【问题标题】:Unable to create MockEndpoint for camel-timer无法为骆驼计时器创建 MockEndpoint
【发布时间】:2021-05-26 02:31:52
【问题描述】:

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

【问题讨论】:

    标签: java apache-camel camel-test


    【解决方案1】:

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

    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。相反,我们将记录“Intercepted!”。

    【讨论】:

    • 谢谢@joni,让我试试这个方法。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多