问题描述
我正在使用 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");
}
};
}
解决方法
据我所知,我们正在尝试解决两个不同的问题:
- MockEndpoint != TimerEndpoint
- 拦截
第一个答案很简单:MockEndpoints 遵循语法 mock:name
。 TimerEndpoint 是一个不同的端点和一个完全不同的对象。我不知道你在这里打算用 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
发送任何内容。相反,我们将记录“拦截!”。