linkdotnet / linkdotnet/BlogExamples

Cron - Not running multiple instances of a job

Abierto
#2 2 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
C#
Estrellas
124
Forks
24
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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 _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);
}
```

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza localizando el manejo del tick del scheduler, el punto de entrada ICronJob y las llamadas a job.Run(stoppingToken). Traza cómo se seleccionan y rastrean los jobs programados. Se considera completado cuando un job programado no vuelve a iniciarse mientras su tarea anterior sigue ejecutándose, pero las ejecuciones posteriores pueden iniciarse después de que finalice.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
csharp
Área
backend
Tipo de issue
Nueva funcionalidad
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.