Как получить размер пула кварцевых потоков во время выполнения?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить размер пула кварцевых потоков во время выполнения?

Сообщение Anonymous »

У меня есть приложение кварца-1.8.6/java, которое использует org.quartz.simplSimpleThreadPool по умолчанию с набором "org.quartz.threadPool.threadCount" (количество рабочих потоков в пуле). до 20.

Я хотел бы периодически опрашивать количество доступных на данный момент потоков в пуле во время выполнения для диагностических целей и было ли оно исчерпан (текущий размер пула равен 0) в течение некоторого времени, запишите предупреждение.

Как получить доступ к текущему количеству доступных потоков в пуле во время выполнения?

Код: Выделить всё

SimpleThreadPool
предоставляет метод getPoolSize(), который, согласно javadoc («Получить текущее количество потоков в ThreadPool.»), должен предоставить искомую информацию. Но как мне получить ссылку на SimpleThreadPool, используемую планировщиком кварца?

Я инициализирую свой планировщик кварца следующим образом:

Код: Выделить всё

SchedulerFactory schedFact = new StdSchedulerFactory();
System.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME,
this.defaultThreadName);
System.setProperty("org.quartz.threadPool.threadCount",
""+this.threadPoolSize);
scheduler = schedFact.getScheduler();

Я думаю добавить глобальный прослушиватель следующим образом:

Код: Выделить всё

scheduler.addGlobalJobListener(new JobListener() {
public void jobToBeExecuted(JobExecutionContext context) {
Scheduler s = context.getScheduler();

// How to get reference to thread pool from scheduler?
// --> ...
}
// other JobListener interface methods
// ...
});
Я не вижу в планировщике никаких методов для прямого доступа к экземпляру threadPool или свойствуpoolSize. Есть ли способ сделать это?

ОТВЕТ:
После нескольких попыток я нашел ответ на свой вопрос, который мне хотел бы поделиться:
  • Как я уже упоминал в комментариях ниже, getPoolSize() на самом деле у меня не работает, поскольку реализовано в org.quartz.simplSimpleThreadPool это просто возвращает то же значение, что и threadCount (количество рабочих потоков в пуле), которое всегда будет одинаковым:

Код: Выделить всё

    public int getPoolSize() {
return getThreadCount();
}

/**
* 
* Set the number of worker threads in the pool - has no effect after
* initialize()
has been called.
*
*/
public void setThreadCount(int count) {
this.count = count;
}


  • Метод, который выполняет эту работу за меня, — QuartzScheduler.getCurrentlyExecutingJobs(). Размер возвращаемого списка — именно то, что мне нужно. Для быстрой проверки концепции я добавил в планировщик следующий глобальный прослушиватель для регистрации текущего количества потоков (ПРИМЕЧАНИЕ. В примере кода я использую io.vavr.control.Try, для получения дополнительной информации см. на https://www.vavr.io/vavr-docs/#_try):

Код: Выделить всё

scheduler.addGlobalJobListener(new JobListener() {
@Override
public void jobToBeExecuted(JobExecutionContext context) {
Scheduler s = context.getScheduler();
JobDetail jd = context.getJobDetail();
// cast raw generic List to List for stream() to work
Try[*]> tryGetCurrentJobs = Try.of(() -> s.getCurrentlyExecutingJobs());
tryGetCurrentJobs
.onSuccess(jobs -> {
List currentJobs = jobs.stream()
.map(o -> (JobExecutionContext)o) // any type error will be discovered here
.collect(Collectors.toList());
logger.info(format(
"job to be executed [%s:%s] - quartz scheduler is using %d out of %d threads in the pool.",
jd.getGroup(), jd.getName(), currentJobs.size(), threadPoolSize));
});
}
// other JobListener interface methods
// ...
});

  • В качестве окончательного решения я решил реализовать одноэлементный наблюдатель, который запускает один поток с запланированным исполнителем пула потоков (вне планировщика кварца). Наблюдатель будет хранить ссылку на кварцевый планировщик и собирать информацию об использовании пула за указанный интервал времени, анализировать ее и отправлять уведомление, если использование пула превышает заранее определенный порог.


Подробнее здесь: https://stackoverflow.com/questions/579 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»