java - 监控 Java 线程池队列 - 如何知道队列大小以及任务在那里花费了多长时间?
问题描述
监控 Java 线程池队列 - 如何知道队列大小以及任务在那里花费了多长时间?
我有一个构造如下的线程池:
int corePoolSize = 10;
int maximumPoolSize = 10;
long keepAliveTime = 0L;
TimeUnit unit = MILLISECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<T>();
ThreadFactory threadFactory = new MyCustomThreadFactory();
RejectedExecutionHandler rejectedExecutionHandler = new MyRejectedExecutionHandler();
ExecutorService executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, rejectedExecutionHandler);
我正在使用它,它工作正常,但可观察性很差。我想知道我目前不知道的事情:
1. 每次插入一个任务workQueue
,表示池已满,我想知道队列有多大。
为此,我将 LinkedBlockingQueue 包装在我自己的队列实现中,如果有东西提供给队列,我将在其中执行一些代码。
2. 在一个任务真正开始之前,我想知道它在队列中停留了多长时间,同时有多少并行任务在运行。
我还没有找到一个干净的解决方案。
我想知道在做这件事上是否有一些好的做法?理想情况下,我希望对这些信息进行一些回调,这样我就可以决定如何处理这些指标(记录它,将它发送到某个监控服务等......)
解决方案
为此,我将 LinkedBlockingQueue 包装在我自己的队列实现中,如果有东西提供给队列,我将在其中执行一些代码。
您可以随时使用ThreadPoolExecutor.getQueue()
方法并获取队列的大小。所以你不需要有自己的队列实现。
在任务开始之前,我想知道在此之前它在队列中停留了多长时间以及同时运行了多少并行任务。
这样的问题只能使用额外的数据结构来解决,因为您需要知道任务入队和出队的时间。但是,我相信,您不需要知道特定任务在队列中停留了多长时间。实际上,您通常需要知道一些汇总时间。只是一个想法,当队列大小大于零或其他值时,您可以使用队列大小并计算不变有效性的时间。您可以使用beforeExecute()
和afterExecute()
回调来实现理想的功能。
推荐阅读
- python - 使用 pytest-bdd 背景设置多行
- sql - 如何使用 SQL 数据透视表将数据行转换为列
- python - 如何进行 Flask-SQLAlchemy 池化?
- ssis - 为什么在尝试执行 SSIS 包时出现错误:“无法与调试主机进程通信”?
- python - 获取 numpy 数组值的矩阵图像 - 内部带有像素值的网格(不是颜色)
- c - fprintf 上的分段错误
- python - 试图在python中的元素中找到一个id
- c# - 在 LINQ to SQL 中,如何将字符串转换为 int?
- vector - 使用现成的函数 'any' 将向量的所有值 0 替换为值 100
- docker - 在 docker 容器中安装 gerrit 插件