我有2条路线。第一个路由使用poll enrich来检查文件是否存在。第二条路线使用同一uri上的民意调查来读取和处理文件。第一个路由通过SEDA队列调用第二个路由,如下所示:
public void configure() throws Exception {
String myFile = "file://myDir?fileName=MyFile.zip&delete=false&readLock=none";
from("direct:test")
.pollEnrich(myFile, 10000)
.to("seda:myQueue")
;
from("seda:myQueue")
.pollEnrich(myFile, 10000)
.log("Do something with the body")
;
}
就目前而言,如果我执行第一条路线,则民意调查会查找文件,但是当第二条路线中的民意调查丰富时,它会返回一个空体。如果我只是自己执行第二个路由,它会正确检索文件。
为什么第二个民意调查富集返回null,文件被锁定了? (我希望使用noop的组合readLock,而delete = false会阻止任何锁定)
骆驼是否认为第二次民意调查是重复的,因此将其过滤掉? (我尝试实现自己的IdempotentRepository在contains()上返回false,但第二个pollEnrich仍然返回null)
您可能想知道我为什么要尝试从2条路线进行充实,第一条路线必须检查是否存在多个文件,只有当所有文件都存在时(即,pollEnrich不返回null)才能第二条路线开始处理它们。
我可以使用pollEnrich的替代品吗?我想也许我需要创建一个通过URI检索文件并将其作为正文返回的bean。
我正在使用camel 2.11.0
答案 0 :(得分:2)
我意识到这是一个古老的话题,但我遇到了类似的问题 我建议你尝试选择:
noop=true
你已经拥有了,
idempotent=false
告诉Camel
OK
两次处理同一个文件。
测试后更新:
我实际上使用上面建议的两种设置对它进行了测试,它可以工作一段时间,但是在中等负载下,它会失败,即为某些交换返回null body,尽管不是全部。
文档指出设置 noop=true
会自动设置 idempotent=true
,因此我不确定在这种情况下是否遵循幂等设置。
答案 1 :(得分:0)
您是否有任何具体原因不使用一条路线?
我不明白你为什么要使用两条路线。文件组件可以检查文件是否存在,如果是,请将其拉出。如果您担心要记住这些文件而不能获得重复项,则可以使用幂等存储库。至少,根据你的问题,我认为你不需要使用两条路线复杂化逻辑,而且内容更丰富EIP。
答案 2 :(得分:0)
第二个路由返回NULL,因为该文件已在第一个路由中使用...如果您只是在所有文件都存在时查找信号消息,则使用文件使用者以及aggregator和可能是claim check以避免在内存中携带大量有效载荷......
答案 3 :(得分:0)
你可能已经知道这不会像人们预期的那样起作用
noop=true&idempotent=false
我的猜测是Camel忽略了idempotent=false
,并且记录中使用了MemoryMessageIdRepository的实例。要解决此问题,可以将文件端点配置为使用自定义幂等仓库:
noop=true&idempotentRepository=#myRepo
并在注册表或spring上下文中注册自定义存储库:
@Component("myRepo")
public class MyRepo implements IdempotentRepository {
@Override
public boolean contains(Object o) {
return false;
}
...
}
答案 4 :(得分:-1)
使用strategyMethodAllowNull =“true”尝试pollEnrich。默认情况下,此值为false。如果为false,则聚合策略将查找现有的Exchange正文,以聚合从文件返回的内容。 当我们使strategyMethodAllowNull =“true”时,现有的主体被视为null。所以每次,文件的内容都被设置到当前的交换体
中