首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Apache Camel重复轮询只读文件系统中的文件(idempotent=false)?

使用Apache Camel重复轮询只读文件系统中的文件(idempotent=false)?
EN

Stack Overflow用户
提问于 2015-05-20 22:34:54
回答 2查看 1.2K关注 0票数 1

我使用轮询消费者模式从给定的只读目录中读取所有文件并对其进行处理。是否有忽略幂等性的选项?

我知道使用noop=true和idempotent=false定义的路由会使整个系统崩溃(无限循环),但是池化消费者模式是一次性的操作,在给定的时刻触发。

EN

回答 2

Stack Overflow用户

发布于 2015-05-20 22:59:57

camel file2端点不会使系统崩溃,因为它默认每秒轮询2次。它将从当时该文件夹中的所有文件创建一条消息。(当然,有一些选项可以忽略最近修改过的文件,但大多数选项都可以忽略)。例如,文件每秒沿流水线发送2倍。

默认情况下,幂等性处于关闭状态,除非传递了'noop‘以将文件保留在输入文件夹中。但是,每次端点轮询时,所有文件都将通过管道。我通常在处理之后移动文件(如果我有多个使用者,则在使用preMove之前),以避免这些重复,并仍然避免幂等存储的复杂性。

如果选择了noop,则无法禁用幂等标志:

代码语言:javascript
复制
    FileConsumer result = newFileConsumer(processor, operations);

    if (isDelete() && getMove() != null) {
        throw new IllegalArgumentException("You cannot set both delete=true and move options");
    }

    // if noop=true then idempotent should also be configured
    if (isNoop() && !isIdempotentSet()) {
        log.info("Endpoint is configured with noop=true so forcing endpoint to be idempotent as well");
        setIdempotent(true);
    }

在这种情况下,在创建消费者之后将重置幂等标志。

可以做的是创建一个IdempotentRepository (http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/IdempotentRepository.html)的简单实现,它忽略所有更新,并告诉端点它以前从未见过这个文件。

代码语言:javascript
复制
    package com.company;

    import org.apache.camel.spi.IdempotentRepository;

    public class DummyIdempotentRepository implements IdempotentRepository {
        @Override
        public boolean add(Object key) {
            return true;
        }

        @Override
        public boolean contains(Object key) {
            return false;
        }

        @Override
        public boolean remove(Object key) {
            return true;
        }

        @Override
        public boolean confirm(Object key) {
            return true;
        }

        @Override
        public void start() throws Exception {

        }

        @Override
        public void stop() throws Exception {

        }
    }

像这样的东西应该就行了。

票数 2
EN

Stack Overflow用户

发布于 2015-05-20 23:45:29

如果要在特定事件上读取文件,请对文件使用者使用pollEnrich

代码语言:javascript
复制
from("direct:readFile")
    .setHeader("CamelFileName", simple("${body}"))
    .pollEnrich("file:///base/folder?fileName=${body}&noop=true", 500)
    .process(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30352792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档