2016-07-31 108 views
3

我工作的骆驼线程池和使用池大小和最大池大小。我的理解是每个请求将由一个线程处理,如果请求>池大小,则将使用最大池大小在池中创建新的一个线程。为了确保我的理解,我在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个文件(2.txt,3.txt)文件。我可以看到收到2个文件没有处理日志的日志。由于我的最大池大小是10,骆驼应该增加线程并选择文件。

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

回答

2

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

线程创建如下

  1. 如果线程池比poolSize小,一个新的线程被创建来处理。

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

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

您可以通过减少QUEUESIZE

+0

是自己测试一下,我改变了** maxQueueSize(-1)**。它按照预期工作。然后,为新工作创建新线程。总是应该是-1。请确认或有任何方法。这将有所帮助 – Gnana

+0

当所有线程忙于处理作业时,作业将被排队。如果您有足够数量的线程进行处理,您可以将队列大小设置为-1,然后为每个作业创建新作业,直到您达到最大PoolSize。 – ravthiru