Camel多次使用来自同一URI的pollEnrich返回null body

时间:2013-12-02 15:37:22

标签: apache-camel

我有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

5 个答案:

答案 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。所以每次,文件的内容都被设置到当前的交换体