我已经设置了带有任务执行器的文件轮询器
ExecutorService executorService = Executors.newFixedThreadPool(10);
LOG.info("Setting up the poller for directory {} ", finalDirectory);
StandardIntegrationFlow standardIntegrationFlow = IntegrationFlows.from(new CustomFileReadingSource(finalDirectory),
c -> c.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS, 5)
.taskExecutor(executorService)
.maxMessagesPerPoll(10)
.advice(new LoggerSourceAdvisor(finalDirectory))
))
//move file to processing first processing
.transform(new FileMoveTransformer("C:/processing", true))
.channel("fileRouter")
.get();
如我所见,我已将threadpool
设置为10,每次轮询最多设置10条消息。如果我放入10个文件,它仍将一个接一个地处理。这里有什么问题吗?
*更新*
尽管我现在还有其他问题,但在加里回答后,它的工作效果很好。
我已经这样设置了Poller
setDirectory(new File(path));
DefaultDirectoryScanner scanner = new DefaultDirectoryScanner();
scanner.setFilter(new AcceptAllFileListFilter<>());
setScanner(scanner);
使用AcceptAll
的原因是可能再次出现同一文件,这就是为什么我先移动文件的原因。但是,当我启用线程执行程序时,由于多个AcceptAllFile
如果我更改为AcceptOnceFileListFilter
可以使用,但是再次出现的相同文件将不会被再次拾取!可以采取什么措施来避免此问题?
问题/错误
在AbstractPersistentAcceptOnceFileListFilter
类中,我们有这段代码
@Override
public boolean accept(F file) {
String key = buildKey(file);
synchronized (this.monitor) {
String newValue = value(file);
String oldValue = this.store.putIfAbsent(key, newValue);
if (oldValue == null) { // not in store
flushIfNeeded();
return true;
}
// same value in store
if (!isEqual(file, oldValue) && this.store.replace(key, oldValue, newValue)) {
flushIfNeeded();
return true;
}
return false;
}
}
例如,如果我现在每次轮询的最大设置为5,并且有两个文件,那么可能的相同文件将由两个线程拾取。
可以说,我的代码在读取文件后即会移动文件。
但是另一个线程进入accept
方法
如果文件不存在,它将返回lastModified时间为0,并且将返回true。
由于文件不存在而导致问题。
如果其为0,则由于文件不再存在,它将返回false。
答案 0 :(得分:2)
将任务执行器添加到轮询器时;所有要做的就是调度程序线程将轮询任务移交给线程池中的线程。 maxMessagesPerPoll
是轮询任务的一部分。轮询器本身仅每5秒运行一次。要获得所需的内容,您应该在流程中添加执行程序通道...
@SpringBootApplication
public class So53521593Application {
private static final Logger logger = LoggerFactory.getLogger(So53521593Application.class);
public static void main(String[] args) {
SpringApplication.run(So53521593Application.class, args);
}
@Bean
public IntegrationFlow flow() {
ExecutorService exec = Executors.newFixedThreadPool(10);
return IntegrationFlows.from(() -> "foo", e -> e
.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS)
.maxMessagesPerPoll(10)))
.channel(MessageChannels.executor(exec))
.<String>handle((p, h) -> {
try {
logger.info(p);
Thread.sleep(10_000);
}
catch (InterruptedException e1) {
Thread.currentThread().interrupt();
}
return null;
})
.get();
}
}
编辑
对我来说很好...
@Bean
public IntegrationFlow flow() {
ExecutorService exec = Executors.newFixedThreadPool(10);
return IntegrationFlows.from(Files.inboundAdapter(new File("/tmp/foo")).filter(
new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "foo")),
e -> e.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS)
.maxMessagesPerPoll(10)))
.channel(MessageChannels.executor(exec))
.handle((p, h) -> {
try {
logger.info(p.toString());
Thread.sleep(10_000);
}
catch (InterruptedException e1) {
Thread.currentThread().interrupt();
}
return null;
})
.get();
}
和
2018-11-28 11:46:05.196信息57607 --- [pool-1-thread-1] com.example.So53521593Application:/tmp/foo/test1.txt
2018-11-28 11:46:05.197信息57607 --- [pool-1-thread-2] com.example.So53521593Application:/tmp/foo/test2.txt
和touch test1.txt
2018-11-28 11:48:00.284信息57607 --- [pool-1-thread-3] com.example.So53521593Application:/tmp/foo/test1.txt
EDIT1
同意-转载与此...
@Bean
public IntegrationFlow flow() {
ExecutorService exec = Executors.newFixedThreadPool(10);
return IntegrationFlows.from(Files.inboundAdapter(new File("/tmp/foo")).filter(
new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "foo")),
e -> e.poller(Pollers.fixedDelay(5, TimeUnit.SECONDS)
.maxMessagesPerPoll(10)))
.channel(MessageChannels.executor(exec))
.<File>handle((p, h) -> {
try {
p.delete();
logger.info(p.toString());
Thread.sleep(10_000);
}
catch (InterruptedException e1) {
Thread.currentThread().interrupt();
}
return null;
})
.get();
}
和
2018-11-28 13:22:23.689信息75681 --- [pool-1-thread-1] com.example.So53521593Application:/tmp/foo/test1.txt
2018-11-28 13:22:23.690信息75681 --- [pool-1-thread-2] com.example.So53521593Application:/tmp/foo/test2.txt
2018-11-28 13:22:23.690信息75681 --- [pool-1-thread-3] com.example.So53521593Application:/tmp/foo/test1.txt
2018-11-28 13:22:23.690信息75681 --- [pool-1-thread-4] com.example.So53521593Application:/tmp/foo/test2.txt