2016-07-08 3 views
0

J'utilise C# Quartz.Net pour créer un travail planifié et le transformer en service Windows en utilisant TopShelf.C# Quartz.Net Le travail du planificateur ne s'exécute pas s'il a obtenu le constructeur paramétré.

Le travail planifié n'est pas en cours d'exécution si la classe contient un constructeur paramétré. J'utilise Unit for Dependency Injection.

Quelqu'un peut-il m'aider quel est le problème?

Voici l'exemple de code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     ISchedulerFactory factory = new StdSchedulerFactory(); 

     IScheduler scheduler = factory.GetScheduler(); 
     scheduler.Start(); 

     IJobDetail job = JobBuilder.Create<SimpleJob>() 
      .WithIdentity("job1", "group1") 
      .Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity("trigger1", "group1") 
      .WithSchedule(CronScheduleBuilder.CronSchedule("0/5 * * * * ?")) 
      .Build(); 

     scheduler.ScheduleJob(job, trigger); 

    } 
} 

public class SimpleJob : IJob 
{ 
    public SimpleJob(IRepository repo) { } //If i comment out this line, then it works. 
    public void Execute(IJobExecutionContext context) 
    { 
     Console.WriteLine("Hello, JOb executed"); 
     Console.ReadLine(); 
    } 
} 

Merci

Répondre

2

Selon les documentation for IJob

Les instances de cette interface doit avoir un constructeur sans argument du public

En définissant votre constructeur, le com Piler suppose que vous ne voulez plus le constructeur par défaut.

Quel est le but de ce constructeur spécial? (Il ne sera pas utilisé par Quartz.)

Si vous avez besoin de ce constructeur à d'autres fins, vous devez également inclure explicitement le constructeur par défaut que Quartz peut ensuite utiliser.

+0

J'ai essayé, y compris le constructeur par défaut ainsi. Ne fonctionne pas Essentiellement, j'essaie d'injecter quelque chose en utilisant Unity dans ce travail. –

+0

Si je vous comprends bien, vous devez obtenir du quartz pour demander l'unité pour créer le travail pour vous, plutôt que de laisser le quartz le créer directement. Si oui, vous ne pouvez pas utiliser l'usine standard, mais quelque chose comme [Quartz.Unity] (https://github.com/hbiarge/Quartz.Unity) (Je ne l'ai pas utilisé moi-même, donc je ne peux pas aider plus loin) – sgmoore

+0

yes.i utilise Quartz.unity. Je pense que parce qu'il y avait une erreur résolvant l'une des dépendances, le constructeur avec des paramètres n'a pas été appelé. maintenant ça marche –

0

La réponse courte est que Quartz.Net nécessite un constructeur sans paramètre. Et c'est ça.

Puisque vous regardez comme si vous voulez INJECTER, voici un article que j'avais bookmarké.

http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/

La ligne d'information clé est

« Vous pouvez créer votre propre implémentation de JobFactory pour accomplir des choses comme avoir votre produit de l'application conteneur IoC ou DI/initialiser l'instance de travail. »

0

Nous avons pu implémenter ceci comme mentionné ci-dessus ayant notre propre JobFactory. Nous voulions traiter nos emplois comme n'importe quelle autre classe en utilisant notre implémentation IOC pour fournir les dépendances dont les emplois ont besoin.

Voici notre implémentation:

public class ContainerJobFactory : PropertySettingJobFactory 
    { 
     private readonly IContainer container; 

     public ContainerJobFactory(IContainer container) 
     { 
      this.container = container; 
     } 

     public override IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) 
     { 
      var job = container.GetInstance(bundle.JobDetail.JobType); 
      if (ReferenceEquals(job, null)) 
       return base.NewJob(bundle, scheduler); 
      SetObjectProperties(job, bundle.JobDetail.JobDataMap); 
      return (IJob) job; 
     } 
    } 

Voici comment nous colmaté dans notre JobFactory:

scheduler.JobFactory = new ContainerJobFactory(StaticContainer.Instance);    
await scheduler.Start();