gpt4 book ai didi

java - Camel 线程池查询

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:38 26 4
gpt4 key购买 nike

我正在研究 Camel 线程池并使用池大小和最大池大小。我的理解是每个请求都将由一个线程处理,如果请求 > 池大小,将使用最大池大小在池中创建一个新线程。为了确保我的理解,我做了以下 POC。

public class FileMoverRoute extends SpringRouteBuilder {

@Override
public void configure() throws Exception {
CamelContext context = getContext();
ExecutorService executorService = new ThreadPoolBuilder(context)
.poolSize(1).maxPoolSize(10).maxQueueSize(100).build("CustomThreadPool");

from("file://C:/from").log("Received ${body}:${threadName}").threads().executorService(executorService)
.log("Processing ${body}:${threadName}").process(new FileProcessor()).to("file://C:/to");
}

}

public class FileProcessor implements Processor{

public void process(Exchange exc) throws Exception {
Map<String, Object> headerMap = exc.getIn().getHeaders();
System.out.println(" sleep for minute");
TimeUnit.MINUTES.sleep(1);
System.out.println(" woke up"+headerMap);
}

}

我在文件处理器中 hibernate 了 1 分钟。如果我从文件夹中放入 1 个文件 (1.txt),我可以在控制台中看到接收和处理日志。如果将接下来的 2 个文件(2.txt,3.txt)文件放入文件夹中。我可以看到收到的 2 个文件未处理日志的日志。因为我的最大池大小是 10,camel 应该增加线程并选择文件。

  1. 为什么没有在池中创建新线程?
  2. 为什么没有选择新文件?
  3. 如何解决这个问题?

最佳答案

由于您将 poolsize 设置为 1 ,因此只会使用一个线程进行处理。

线程创建如下

  1. 如果线程池小于 poolSize,则创建一个新线程进行处理。

  2. 如果作业小于 maxQueueSize,则将作业放在队列中等待空闲线程。

  3. 如果队列已满且线程池实例化的线程少于 maxPoolSize,则会创建一个新线程来处理作业。

可以通过减小QueueSize自行测试

关于java - Camel 线程池查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com