Gna*_*ana 5 java multithreading apache-camel threadpool
我正在研究骆驼线程池并使用池大小和最大池大小。我的理解是每个请求将由一个线程处理,如果请求 > 池大小,将使用最大池大小在池中创建一个新线程。为了确保我的理解,我在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在文件处理器中睡了 1 分钟。如果我从文件夹中放入 1 个文件(1.txt),我可以在控制台中看到收到和处理日志。如果将接下来的 2 个文件 (2.txt,3.txt) 文件从文件夹中放入。我可以看到 2 个未处理日志的文件的接收日志。由于我的最大池大小是 10,camel 应该增加线程并选择文件。
由于您将 poolsize 设置为 1 ,因此将仅使用一个线程来处理。
线程创建如下
如果线程池小于poolSize,则创建一个新线程来处理。
如果作业小于 maxQueueSize,则作业将被放入队列中等待空闲线程。
如果队列已满并且线程池实例化的线程少于 maxPoolSize,则会创建一个新线程来处理作业。
您可以通过减小QueueSize自行测试
| 归档时间: |
|
| 查看次数: |
1588 次 |
| 最近记录: |