2011-02-01 10 views
7

i necesidad de poner en práctica el siguiente escenario usando Quartz.NET:Quartz.NET, repiten cada x semanas

repiten cada n semanas (s) sobre: ​​
domingo y/o el lunes, martes, miércoles, jueves, Viernes, sábado ...

Entonces, por ejemplo, podría seleccionar: lunes y jueves, y repetir cada 2 semanas, ¿es esto posible?

lo averigüe que el camino a seguir podría ser el uso de las expresiones Cron, pero no he tenido suerte hasta ahora con los "Repetir cada X semanas"

Gracias!

Respuesta

6

Esta es la solución que he usado ...

Cuando no hay recurence i utilizar un disparador de cron y seleccione los días y hacer que se ejecute cada semana

POR EJEMPLO 0 0 * * 1,2,3

cuando hay recursión para cada día seleccionado agrego un SimpleTrigger, en pocas palabras la fecha de inicio es el día de la semana y luego calculo la recurrencia multiplicando el recuento de 7

Así que terminaré con un simple disparador para cada día.

¡Espero que esto ayude a otra persona!

3

Es un disparador de complext, puede administrar por 3 disparadores;

  1. gatillo muestra de cron 2 semanas: "0 0 0 1 *"
  2. gatillo de 2 semanas muestra de cron: "0 0 0 15 *"
  3. gatillo trigonométricas seleccionada días muestra cron: "0 0 0? * SUN-SAT"

primer disparador creará 3. segundo desencadenante eliminará 3.

Buena suerte.

+0

no he tenido el paso 4-5, gracias por la Answare –

+0

no había pasos 4-5, no sé cómo número de compilación del editor stackoverflow :) 1.2.3 y después de 4.5. Me han editado la respuesta de nuevo. Gl. –

7

¿Está ejecutando Quartz.Net 2.0 y la opción para usted? Todavía no se ha lanzado oficialmente, pero hay un nuevo tipo de activador que resuelve tu problema. Se llama disparador de intervalo de calendario. Básicamente lo defines tal como lo describiste en tu pregunta. Establece el intervalo en 2 y la unidad de intervalo en semanas, y se dispara cada 2 semanas. He escrito una publicación que lo describe here. Puede acceder a la documentación del código fuente here.

+0

wow Impresionante, esperando ansiosamente ese Gatillo! –

0

Desafortunadamente, Quartz.Net 2 no se ha publicado, no está documentado y presenta cambios bruscos.

Como dicen Aureliano y Bongo, una combinación de desencadenantes podría ayudar, pero no entiendo muy bien sus respectivas soluciones.

Mi solución es envolver un CronTrigger y omitir los eventos no deseados:

var ct = new CronTrigger(); 
ct.CronExpression = new CronExpression(
    string.Format("0 {0} {1} ? * {2} *", 
    minuteOfHour, hourOfDay, daysList)); 
ct = new WeeklyTriggerWrapper(ct, 2); 

public class WeeklyTriggerWrapper : CronTrigger 
{ 
    public CronTrigger Trigger 
    { 
     get; 
     private set; 
    } 

    public int WeekInterval 
    { 
     get; 
     private set; 
    } 

    public DateTime? LastFireDateTime 
    { 
     get; 
     private set; 
    } 

    public WeeklyTriggerWrapper(CronTrigger trigger, int weekInterval) 
    { 
     Trigger = trigger; 
     WeekInterval = weekInterval; 
    } 

    public override DateTime? ComputeFirstFireTimeUtc(ICalendar cal) 
    { 
     return Trigger.ComputeFirstFireTimeUtc(cal); 
    } 

    public override DateTime? GetFireTimeAfter(DateTime? afterTimeUtc) 
    { 
     var result = Trigger.GetFireTimeAfter(afterTimeUtc); 

     if (result.HasValue) 
     { 
      DateTime reference = StartTimeUtc; 

      if (LastFireDateTime.HasValue && LastFireDateTime.Value > reference) 
       reference = LastFireDateTime.Value; 

      reference = reference.AddDays(7 * WeekInterval); 

      while (result.HasValue && result.Value < reference) 
       result = Trigger.GetFireTimeAfter(result.Value); 
     } 

     LastFireDateTime = result; 
     return result; 
    } 

    // TODO: handle events... 
} 
Cuestiones relacionadas