骆驼线程池查询

时间:2016-07-31 16:45:47

标签: java multithreading apache-camel threadpool

我正在开发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);
    }

}

我在文件处理器中睡了1分钟。如果我从文件夹中放入1个文件(1.txt)我可以看到收到的&amp;处理登录控制台。如果将下一个2个文件(2.txt,3.txt)文件放在文件夹中。我可以看到收到的2个文件的日志没有处理日志。因为我的最大池大小是10,所以驼峰应该增加线程并选择文件。

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

1 个答案:

答案 0 :(得分:2)

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

创建线程如下

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

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

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

  4. 您可以通过减少QueueSize

    来自行测试