Java 如何在运行时获得石英线程池大小?

Java 如何在运行时获得石英线程池大小?,java,quartz,Java,Quartz,我有一个quartz-1.8.6/java应用程序,它正在使用默认的org.quartz.simplethreadpool,“org.quartz.threadPool.threadCount”(池中的工作线程数)设置为20 我希望在运行时定期轮询池中当前可用线程的数量,以便进行诊断,如果已耗尽(当前池大小为0)一段时间,请记录警告 如何在运行时访问池中当前可用线程数 SimpleThreadPool提供了一个方法getPoolSize(),根据javadoc(“获取线程池中的当前线程数”),该

我有一个quartz-1.8.6/java应用程序,它正在使用默认的
org.quartz.simplethreadpool
“org.quartz.threadPool.threadCount”
(池中的工作线程数)设置为20

我希望在运行时定期轮询池中当前可用线程的数量,以便进行诊断,如果已耗尽(当前池大小为0)一段时间,请记录警告

如何在运行时访问池中当前可用线程数

SimpleThreadPool
提供了一个方法
getPoolSize()
,根据javadoc(“获取线程池中的当前线程数”),该方法将提供我要查找的信息。但是如何获取石英调度器使用的
SimpleThreadPool
的引用呢

我按如下方式初始化quartz计划程序:

SchedulerFactory schedFact=new StdSchedulerFactory();
System.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME,
本文件(名称);
System.setProperty(“org.quartz.threadPool.threadCount”,
“”+此.threadPoolSize);
scheduler=schedFact.getScheduler();
我想添加如下全局侦听器:

scheduler.addGlobalJobListener(新的JobListener(){
public void作业待执行(作业执行上下文){
调度器s=context.getScheduler();
//如何从调度程序获取对线程池的引用?
// --> ...
}
//其他JobListener接口方法
// ...
});
我在
调度程序
中没有看到任何方法可以直接访问
线程池
实例或
池大小
属性。有办法吗

回答: 经过几次试验,我找到了我自己问题的答案,我想与大家分享:

  • 正如我在下面的评论中提到的
    getPoolSize()
    实际上并不适用于我,因为在
    org.quartz.SimpleThreadPool
    中实现时,它只返回与
    threadCount
    相同的值(池中的工作线程数),该值始终相同:
public int getPoolSize(){
返回getThreadCount();
}
/**
*
*设置池中的工作线程数-在
*已调用
initialize()
。 *

*/ 公共void setThreadCount(整数计数){ this.count=计数; }
  • 为我做这项工作的方法是
    QuartzScheduler.getCurrentlyExecutingJobs()
    。返回列表的大小正是我所需要的。为了快速验证概念,我在调度程序中添加了以下全局侦听器以记录当前使用的线程数(注意:我在示例代码中使用
    io.vavr.control.Try
    ,有关更多信息,请参阅):
scheduler.addGlobalJobListener(新的JobListener(){
@凌驾
public void作业待执行(作业执行上下文){
调度器s=context.getScheduler();
JobDetail jd=context.getJobDetail();
//将原始泛型列表强制转换为列表以使stream()工作

TryI可以看到在QuartzScheduler类中有一个获取threadPoolSize的方法,它是调度器的具体实现。您需要获得该实例的挂钩。谢谢@user06062019。我原以为threadPoolSize对我有用,但在org.quartz.siml.SimpleThreadPool中实现时,它只返回线程数,这只是最大值m池中的工作线程数。因此此值将始终相同。对我有效的方法是QuartzScheduler.getCurrentlyExecutingJobs()返回列表的大小正是我所需要的。我可以看到QuartzScheduler类中有一个获取threadPoolSize的方法,它是调度器的具体实现。您需要获得该实例的挂钩。谢谢,@user06062019。我原以为threadPoolSize适合我,但在org.quartz.siml.SimpleThreadPool中实现了它只返回thread count,这是池中工作线程的最大数量。因此,该值始终相同。适合我的方法是QuartzScheduler.getCurrentlyExecutingJobs(),返回列表的大小正是我所需要的。