我正在研究骆驼线程池,并使用池大小和最大池大小。我的理解是,每个请求将由一个线程处理,如果请求>池大小,则将使用最大池大小在池中创建新的一个线程。为了确保我的理解,我在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);
}
}
我在文件处理器里睡了1分钟。如果我从文件夹中放入1个文件(1.txt),我可以看到收到的&正在处理登录控制台。如果将下两个文件(2.txt,3.txt)从文件夹中放入。我可以看到收到的2个文件的日志没有处理日志。由于我的最大池大小是10,camel应该增加线程并选择文件。
- 为什么没有在池中创建新线程
- 为什么没有选择新文件
- 如何解决这个问题
由于已将池大小设置为1,因此将只使用一个线程进行处理。
线程创建如下
-
如果线程池小于poolSize,则会创建一个新线程进行处理。
-
如果作业小于maxQueueSize,则将作业放置在队列中以等待空闲线程。
-
若队列已满,并且线程池实例化的线程数小于maxPoolSize,则会创建一个新线程来处理作业。
您可以通过减少QueueSize 来自行测试