Cron - Not running multiple instances of a job
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Comece localizando o tratamento do tick do scheduler, o ponto de entrada ICronJob e as chamadas para job.Run(stoppingToken). Rastreie como os jobs agendados são selecionados e acompanhados. O trabalho estará concluído quando um job agendado não for iniciado novamente enquanto sua tarefa anterior ainda estiver em execução, mas execuções posteriores puderem ser iniciadas após a conclusão.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
This is not an elaborate solution, but it works (in theory). You can't choose to have multiple instances running or not. I just assumed not to have multiple instances running regardless. I assumed this is not required unless you are running a job every minute or two.
I added a field to the scheduler that tracks the Task returned by job.Run(stoppingToken);. On ever tick check the list for completed tasks and clear them. Prior to running a job skip if it is on the list of running jobs.
I'm sure this might need some tweaking this was my first attempt at it.
private Dictionary<string, Task> _runningJobs;
.
.
.
// Clear completed jobs
foreach (var key in _runningJobs.Keys)
{
if (_runningJobs[key].IsCompleted)
{
_runningJobs[key].Dispose();
_runningJobs.Remove(key);
}
}
// Run jobs that are in the map
RunActiveJobs(runMap, now, stoppingToken);
.
.
.
foreach (var run in currentRuns)
{
// We are sure (thanks to our extension method)
// that the service is of type ICronJob
var job = (ICronJob)_serviceProvider.GetRequiredService(run);
string jobName = job.GetType().Name;
// Continue to next job if job is already running
if (_runningJobs.ContainsKey(jobName))
{
continue;
}
// We don't want to await jobs explicitly because that
// could interfere with other job runs
var task = job.Run(stoppingToken);
// Add task to running jobs
_runningJobs.Add(jobName, task);
}
- Linguagem predominante
- C#
- Estrelas
- 124
- Forks
- 24
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de linkdotnet/BlogExamples
-
Cannot build Android ToDoApp Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 30/100
linkdotnet/BlogExamples#1 · 3 comentários ·
Todas as issues de linkdotnet/BlogExamples
Issues semelhantes
-
CS0162 "Unreachable code detected" warning from a MSBuildTemp .tmp file in every game project Abertabug
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
Type: enhancement
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
apache/arrow-adbc#4809 ·
-
type/automation type/tech-debt
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
microsoft/vscode-azurefunctions#5197 · 1 comentário ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 85/100
microsoft/microsoft-ui-reactor#1274 ·