[Draft] Added Scheduling DB module#668
Conversation
Standardized scheduling telemetry
Test Results138 tests 138 ✅ 8m 4s ⏱️ Results for commit 34da7ae. ♻️ This comment has been updated with latest results. |
| var threads = Math.max(1, resolvedJobs.size()); | ||
|
|
||
| var scheduler = Scheduler.create(this.dataSource, tasks) | ||
| .threads(threads) |
There was a problem hiding this comment.
Сейчас не конфигурируется параметр режима работы планировщика, используется по умолчанию FETCH (основанный на оптимистических блокировках).
- В случае PostgreSql пропускная способность в дефолтном режиме значительно ниже (и больше количество выборок обновлений => bloat). Лучше использовать
LOCK_AND_FETCH(основанный на SKIP LOCKED, правда не во всех СУБД он поддерживается). Можно добавить конфигурирование параметра черезScheduler.pollUsingLockAndFetch).
| startupTasks.add(startupTask); | ||
| } | ||
| } | ||
| var threads = Math.max(1, resolvedJobs.size()); |
There was a problem hiding this comment.
Возможно, конфигурация пользователем количества потоков позволит оптимально утилизировать пул планировщика. Сейчас количество потоков зависит, в том числе, от RunOnceJob, что при большом количестве таких джобов может создать большое количество потоков в fixed thread pool (которые будут простаивать).
|
|
||
| @Override | ||
| @Nullable | ||
| public RecurringTask<?> startupTask() { |
There was a problem hiding this comment.
nit: возможно:
@Override
public boolean isStartupTask() {
return SHOULD_BE_STARTED.test(task());
}
по аналогии с тем, как фильтруются джобы в самой либе
| .pollingInterval(this.config.pollingInterval()) | ||
| .shutdownMaxWait(this.config.shutdownWait()) | ||
| .tableName(this.config.tableName()) | ||
| .startTasks(startupTasks) |
There was a problem hiding this comment.
Есть предположение, что не стартанет шедуллер, если задавать одну и ту же задачу как дважды (в конструкторе и .startTasks). Когда я делаю тест:
@Test
public void onstartup_should_always_commit() {
final TestTasks.CountingHandler<Void> counter = new TestTasks.CountingHandler<>();
final RecurringTask<Void> recurring1 =
Tasks.recurring("recurring1", new FutureSchedule()).execute(counter);
// Setup non auto-committing datasource
Scheduler scheduler =
Scheduler.create(noAutocommitingDatasource, recurring1)
.startTasks(recurring1)
.schedulerName(new SchedulerName.Fixed("test"))
.commitWhenAutocommitDisabled(false)
.build();
stopScheduler.register(scheduler);
scheduler.start();
final Optional<ScheduledExecution<Object>> scheduledExecution =
scheduler.getScheduledExecution(recurring1.getDefaultTaskInstance());
assertThat(scheduledExecution, not(empty()));
}
возникает ошибка:
java.lang.IllegalStateException: Duplicate key recurring1 (attempted merging values RecurringTask name=recurring1, onComplete=OnCompleteReschedule with com.github.kagkarlsson.scheduler.compatibility.NoAutocommitTest$FutureSchedule@4defd42 and RecurringTask name=recurring1, onComplete=OnCompleteReschedule with com.github.kagkarlsson.scheduler.compatibility.NoAutocommitTest$FutureSchedule@4defd42)
at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.github.kagkarlsson.scheduler.TaskResolver.<init>(TaskResolver.java:45)
at com.github.kagkarlsson.scheduler.SchedulerBuilder.build(SchedulerBuilder.java:250)
at com.github.kagkarlsson.scheduler.compatibility.NoAutocommitTest.onstartup_should_always_commit(NoAutocommitTest.java:81)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Именно по этому в либе разделяют startup и не-startup джобы (здесь и здесь).
Added Scheduling DB module
Merge after #667