2017-07-10 1 views
1

En utilisant Quartz.NET, je suis en train de créer un déclencheur qui:Quartz.net - Répéter le jour n, tous les m mois?

  1. commence Septembre 30,
  2. se répète sur le dernier jour
  3. de tous les 5 mois.
  4. pouvoir utiliser ITrigger.GetFireTimeAfter() pour calculer/projet la prochaine fois de feu (retour UI)

attendu:

  • 2017-9-30
  • 2018-2-28
  • 2018-7-31
  • 2018-12-31

Je pensais que je pouvais utiliser un CronTrigger (c.-à-0 0 0 L 9/5 ? *)

Mais les jours sont prévus:

  • 2017-9-30
  • 2018-9-30
  • 2019-9-30

Impossible d'utiliser CalendarIntervalTrigger soit:

Par exemple, si vous choisissez une heure de début qui a lieu le 31 janvier et que vous avez un déclencheur avec l'unité Mois et intervalle 1, l'heure de déclenchement suivante sera le 28 février et la prochaine fois après le 28 mars. essentiellement, chaque tir subséquent aura lieu le 28 du mois, même s'il existe un 31e jour. Si vous voulez un déclencheur qui déclenche toujours le dernier jour du mois - quel que soit le nombre de jours dans le mois, vous devez utiliser ICronTrigger

Quartz.NET documentation

Comment puis-je planifier un déclencheur comme celui-ci? Dois-je implémenter mon propre trigger et IScheduler à partir de zéro? Ou y a-t-il un moyen pour moi d'injecter dans un calcul personnalisé?

Merci

+1

Ce n'est pas quelque chose que j'ai essayé, mais il pourrait être possible d'utiliser le Cron Expression 0 0 0 L */5? * avec ModifiedByCalendar et un couple de CronCalenders pour exclure les mois 7,8,10,11,12 en 2017 et 1,3,4,5,6,8,9,10,11 en 2018 etc. – sgmoore

Répondre

1

Ce n'est pas la manière dont l'expression cron fonctionne. En le définissant "9/5" vous venez d'exprimer "début septembre" et "icrement de 5 mois" mais il n'y a pas quatorzième mois. Chaque mois qui dépasse le nombre de mois sera coupé, par exemple 1/5 sera évalué à "Janvier" puis "Juin" et enfin à "Novembre". Un autre essai dépassera les mois comptera et cron commencera dès le début. Donc, il va commencer à partir d'un autre "Janvier", puis "Juin" et enfin "Novembre". Regardez l'expression, si elle fonctionnerait comme vous voulez, il ne tient pas l'expression dans la prochaine année becouse par exemple 1/5 serait évaluée en « Avril »

1/5 => January (2017) +5 
1/5 => June (2017) +5 
1/5 => November (2017) +5 
1/5 => April (2018) +5 

qui est mal! becouse Avril ne correspond pas 1/5

Ce comportement est correct:

1/5 => January (2017) +5 
1/5 => June (2017) +5 
1/5 => November (2017) +5 
1/5 => January (2018) +5 
1/5 => June (2018) 
... 

Qu'est-ce que vous avez vraiment besoin est un outil qui fonctionne d'une manière différente. Je ne pense pas qu'il y ait un moyen de forcer Quartz.NET Cron à fonctionner comme vous voulez. Le seul moyen serait de "remplacer" l'évaluateur cron Quartz.NET par quelque chose de différent. Si vous regardez un peu, vous pourriez trouver la bibliothèque dont je suis un auteur qui implémente un petit langage spécifique au domaine qui devrait être beaucoup mieux adapté à ce que vous aimeriez faire. Je l'ai décrit ici: