我使用轮询消费者模式从给定的只读目录中读取所有文件并对其进行处理。是否有忽略幂等性的选项?
我知道使用noop=true和idempotent=false定义的路由会使整个系统崩溃(无限循环),但是池化消费者模式是一次性的操作,在给定的时刻触发。
发布于 2015-05-20 22:59:57
camel file2端点不会使系统崩溃,因为它默认每秒轮询2次。它将从当时该文件夹中的所有文件创建一条消息。(当然,有一些选项可以忽略最近修改过的文件,但大多数选项都可以忽略)。例如,文件每秒沿流水线发送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);
}在这种情况下,在创建消费者之后将重置幂等标志。
可以做的是创建一个IdempotentRepository (http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/IdempotentRepository.html)的简单实现,它忽略所有更新,并告诉端点它以前从未见过这个文件。
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 {
}
}像这样的东西应该就行了。
发布于 2015-05-20 23:45:29
如果要在特定事件上读取文件,请对文件使用者使用pollEnrich:
from("direct:readFile")
.setHeader("CamelFileName", simple("${body}"))
.pollEnrich("file:///base/folder?fileName=${body}&noop=true", 500)
.process(...)https://stackoverflow.com/questions/30352792
复制相似问题