2011-01-03 13 views
6

Tengo un servicio de Windows con Quartz.Net incorporado, pero parece que no puedo encontrar una manera de crear una referencia a un objeto instanciado dentro de un trabajo Quartz.Net ...¿Cómo crear una referencia a un objeto instanciado dentro de un trabajo de Quartz.Net?

Cuando se inicia el servicio Windows, crea una instancia algunos objetos para el registro, el acceso a la base de datos y otros propósitos, por lo que me gustaría que mis trabajos de Quartz.Net usen estos objetos ya instanciados en lugar de crear sus propias instancias de estos objetos. Sin embargo, los trabajos de Quartz.Net son instanciados por el planificador utilizando el constructor sin argumentos y, por lo tanto, no hay forma de pasar una referencia usando el constructor.

¿Tengo que crear mi propia implementación de JobFactory y esa es la única forma de lograr esto?

Respuesta

1

contexto diferente (Linux/JAVA), pero crea tu propia fábrica que hereda de la de Quartz. Reemplaza el método "createScheduler". Llame al método súper, guarde la instancia en un mapa hash estático (sincronizado). Escriba el método estático para obtener instancia por nombre.

2

Puede agregar pares de objetos clave-valor en jobDetail.JobDataMap y recuperarlos from(JobExecutionContext) context.JobDetail.JobDataMap.

+0

el sitio web de cuarzo dice "sólo almacenan tipos de datos primitivos (incluyendo cuerdas) en el JobDataMap" - http://www.quartz-scheduler.org/documentation/best-practices – TruthOf42

3

Creo que el enfoque que funciona para esta situación es usar un job listener. Puede crear un trabajo "ficticio" que no haga nada, y un oyente que detecte cuándo se ejecutó el trabajo. Puede crear instancias del oyente con referencias a cualquier dependencia, siempre que estén disponibles en el momento de configurar la programación del trabajo.

IJobDetail job = JobBuilder.Create<DummyJob>() 
      .WithIdentity("job1") 
      .Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity("trigger1") 
      .StartNow() 
      .WithSimpleSchedule(x => x 
       .WithInterval(interval) 
       .RepeatForever()) 
      .Build(); 

     _scheduler.ScheduleJob(job, trigger); 

     MyJobListener myJobListener = new MyJobListener (dependency1, dependency2); 

     _scheduler.ListenerManager.AddJobListener(myJobListener, KeyMatcher<JobKey>.KeyEquals(new JobKey("job1"))); 
+0

Estoy de acuerdo contigo, como lo hace la documentación a la que apunta su enlace "oyente del trabajo". Tuve el mismo problema que Dean y Google me enviaron aquí: prefiero su solución a la elegida y la he implementado en consecuencia. – roadkill

Cuestiones relacionadas