2016-08-26 4 views
0

J'utilise le planificateur Quartz.net pour la migration de données d'une base de données à une autre. Je veux démarrer un travail séparé pour chaque transfert de données de table de base de données. J'ai un travail parent pour la migration de données qui déclenche des travaux enfants pour chaque table. Je souhaite que le travail parent attende la fin de tous les travaux enfants, mais dès que je démarre le travail parent, tous les travaux enfants continuent de s'exécuter, mais le travail parent est terminé dès qu'il déclenche tout le travail. merci d'avance ..Le concept d'emploi parent-enfant existe-t-il dans Quartz.net

Exemple de code est donné ci-dessous

public class DataMigrationJob : IJob 
    { 
    public void Execute(IJobExecutionContext context) 
    { 

     List<string> tableList = somelist; 
     foreach (var table in tableList) 
     { 
      JobDetailImpl job = new JobDetailImpl(jobKey, groupName, tableJobType, true, true); 
     if (!SchedulerProvider.Scheduler.CheckExists(job.Key)) 
     { 
      context.Scheduler.AddJob(job, true, true); 
     } 
     context.Scheduler.TriggerJob(job.Key); 
     } 
    }    
}  

Y at-il une bonne façon de garder l'emploi des parents en cours d'exécution jusqu'à ce que tous les travaux sont faits les enfants?

J'ai une idée de le faire fonctionner en utilisant en boucle qui fera appel à une fonction dans un état et ajouter attente, quelque chose comme ci-dessous

public boolena AllChildrenJobCompleted(IJobExecutionContext context,    List<JobKey> jobKeys)   
    { 
     runningJobsList = context.Scheduler.GetCurrentlyExecutingJobs(); 
     //check if children jobs are part of this list 
     //return false until list contains any of the child job 
     //return true when list does not contain child jobs 
    } 

plus tard cette fonction peut être appelée à l'intérieur d'exécuter la fonction de travail parent comme this

 while(!AllChildrenJobCompleted(context,childJobs)) 
     {wait(1000);} 

Vous ne savez pas si c'est la meilleure pratique.

Répondre

0

Pourquoi avez-vous besoin d'emplois pour les enfants? Vous pouvez simplement avoir un travail, qui crée un ensemble de Tasks asynchrone, les exécute et attend que tous les objets Tâche fournis pour terminer l'exécution.

En conséquence à quartz-documentation il n'y a actuellement aucun moyen de la chaîne « directe » ou « libre » déclenche avec Quartz, mais il y a plusieurs façons dont vous pouvez accomplir sans beaucoup d'efforts:

  • Une façon est utiliser un écouteur (c'est-à-dire un TriggerListener, un JobListener ou un SchedulerListener) qui peut remarquer la fin d'un travail/trigger et ensuite planifier immédiatement un nouveau trigger à déclencher. Cette approche peut être un peu compliquée, car vous devrez informer l'auditeur du travail qui suit - et vous devrez peut-être vous inquiéter de la persistance de cette information. Voir l'écouteur org.quartz.listeners.JobChainingJobListener qui est livré avec Quartz - car il a déjà une partie de cette fonctionnalité. Une autre méthode consiste à créer un Job qui contient dans JobDataMap le nom du travail suivant à déclencher et à mesure que le travail est terminé (la dernière étape de sa méthode execute()), le travail planifie le travail suivant.

+0

Merci pour vos commentaires, en fait je veux afficher l'état des travaux d'enfants dans l'interface utilisateur de quartz. Dans le cas où l'un des travaux enfant est échoué, je devrais pouvoir le déclencher de nouveau à partir de l'interface utilisateur. Chaque travail enfant est un travail indépendant et le travail parent est requis car j'ai besoin d'un seul point où tous les travaux enfants peuvent être déclenchés en même temps. – user4549753