Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache Camel重复轮询只读文件系统中的文件(幂等=false)?_Java_Apache Camel_Producer Consumer_Idempotent - Fatal编程技术网

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

Java 使用Apache Camel重复轮询只读文件系统中的文件(幂等=false)?,java,apache-camel,producer-consumer,idempotent,Java,Apache Camel,Producer Consumer,Idempotent,我使用轮询消费者模式从给定的只读目录中读取所有文件并对其进行处理。是否有忽略幂等性的选项 我知道用noop=true&idempotent=false定义的路由会使整个系统崩溃(无限循环),但池消费模式是一次性操作,在给定时刻触发 骆驼文件2端点不会使系统崩溃,因为默认情况下它每秒轮询2次。它将从当时该文件夹中的所有文件创建一条消息。(当然,有一些选项可以忽略最近修改的文件,但大多数都是这样)。e、 g.文件沿管道每秒发送2次 默认情况下,幂等性处于禁用状态,除非传递“noop”以基本上将文件保

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


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

骆驼文件2端点不会使系统崩溃,因为默认情况下它每秒轮询2次。它将从当时该文件夹中的所有文件创建一条消息。(当然,有一些选项可以忽略最近修改的文件,但大多数都是这样)。e、 g.文件沿管道每秒发送2次

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

选择noop时,无法禁用幂等标志:

    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);
    }
在这种情况下,创建使用者后,幂等标志将重置

可以做的是创建一个简单的幂等存储库()实现,它忽略所有更新,并告诉端点它以前从未见过这个文件

    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 {

        }
    }

类似这样的操作应该可以完成。

如果要读取特定事件的文件,请与文件使用者一起使用
pollRich

from("direct:readFile")
    .setHeader("CamelFileName", simple("${body}"))
    .pollEnrich("file:///base/folder?fileName=${body}&noop=true", 500)
    .process(...)

您是否参考了“池消费者模式”,我知道的是由file2端点实现的“轮询消费者模式”。相同的文件应该通过管道重复发送的用例是什么?我正在扫描(索引)给定目录中的所有文件。此操作不应以任何方式修改文件或目录,并且应可重复。当我第二次索引文件夹时,默认的幂等设置会导致不读取任何文件(因为Camel会将以前读取的所有文件缓存到存储库缓存中…),您可以始终使用数据库幂等缓存,并在下次运行之前清除该表。不过,这是一个非常奇怪的用例,让我想起了我从无知的业务用户那里收到的一些请求。什么样的事件触发了文件的读取?这与幂等存储库存储处理过的文件,以便下次不再处理这些文件不是有同样的问题吗?出于某种原因,这是OP的一项要求。我不理解@martin-v问题:我不知道他是想阻止在不重命名文件的情况下重新读取文件(像您这样的自定义幂等存储库是一种解决方案),还是想在更新和触发事件时减少读取文件的频率(我的解决方案)。