2010-05-04 2 views
1

J'ai un travail temporisé quartz.net fonctionnant correctement sur ma machine dev, mais une fois déployé sur un serveur distant, il ne se déclenche pas. Je crois que le travail est planifié correctement, parce que si je postback, il me dit que le travail existe déjà (je vérifie normalement pour la publication cependant). Le code de messagerie fonctionne définitivement, car l'événement 'button1_click' envoie des emails avec succès. Je comprends que j'ai une confiance totale ou moyenne sur le serveur de suppression. Mon hôte dit qu'ils n'appliquent pas les restrictions qu'ils savent qui pourraient l'affecter. Toutes les autres choses que je dois faire pour le faire fonctionner?Le planificateur Quartz.Net fonctionne localement mais pas sur l'hôte distant

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Quartz; 
using Quartz.Impl; 
using Quartz.Core; 
using Aspose.Network.Mail; 
using Aspose.Network; 
using Aspose.Network.Mime; 
using System.Text; 

namespace QuartzTestASP 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       ISchedulerFactory schedFact = new StdSchedulerFactory(); 
       IScheduler sched = schedFact.GetScheduler(); 
       JobDetail jobDetail = new JobDetail("testJob2", null, typeof(testJob)); 
       //Trigger trigger = TriggerUtils.MakeMinutelyTrigger(1, 3); 
       Trigger trigger = TriggerUtils.MakeSecondlyTrigger(10, 5); 
       trigger.StartTimeUtc = DateTime.UtcNow; 
       trigger.Name = "TriggertheTest"; 
       sched.Start(); 
       sched.ScheduleJob(jobDetail, trigger); 
      } 
     } 
     protected void Button1_Click1(object sender, EventArgs e) 
     { 
      myutil.sendEmail(); 
     } 
    } 

    class testJob : IStatefulJob 
    { 
     public testJob() { } 

     public void Execute(JobExecutionContext context) 
     { 
      myutil.sendEmail(); 
     } 

    } 

    public static class myutil 
    { 
     public static void sendEmail() 
     { 
      // tested code lives here and works fine when called from elsewhere 
     } 
    } 
} 

Répondre

5

La fabrique du planificateur doit être globale pour votre application. En d'autres termes, déclarez-le dans Global.asax ou similaire qui vous donne effectivement une instance globale avec laquelle opérer. Vous devez démarrer le planificateur dans le démarrage de votre application si vous exécutez ASP.NET.

Prenez garde. ASP.NET recycle ses processus qui provoquent l'arrêt effectif du planificateur (aucun travail ne s'exécutera) jusqu'à ce que la requête suivante suivante arrive sur le serveur Web pour redémarrer le planificateur. La méthode recommandée est d'avoir un service Windows pour exécuter les travaux Quartz.NET.

+0

Merci beaucoup. Vous avez raison, la portée était le problème ...! – Glinkot

+0

@MarkoLahma Merci, mais pour autant que je sache, Quartz.NET est utilisé pour ne pas utiliser Win Service. Donc, si nous devions utiliser Win Service, est-il nécessaire d'utiliser Quartz.net? Y a-t-il une autre solution du côté de l'application? Si oui, pourriez-vous donner un exemple pour l'application MVC? –

+1

@Christof vous * pouvez * héberger Quartz dans l'application ASP.NET mais il a ses pièges comme indiqué. Vous * devez * héberger Quartz.NET de préférence dans un service Windows et vous pouvez également avoir une interface de gestion à l'aide de ASP.NET MVC etc qui n'exécute pas les tâches, gère uniquement les plannings et les tâches. –

Questions connexes