2010-05-04 3 views
1

У меня есть работа с timed quartz.net, работающая отлично на моей машине dev, но после ее развертывания на удаленном сервере она не запускается. Я считаю, что работа запланирована нормально, потому что, если я вернусь назад, она сообщит мне, что работа уже существует (однако я обычно проверяю обратную передачу). Код электронной почты определенно работает, поскольку событие «button1_click» успешно отправляет письма.Планировщик Quartz.Net работает локально, но не на удаленном хосте

Насколько я понимаю, у меня есть полное или среднее доверие на удаленном сервере. Мой хозяин говорит, что они не применяют ограничений, которые, как они знают, повлияют на него. Любые другие вещи, которые мне нужно сделать, чтобы запустить его?

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 
     } 
    } 
} 

ответ

5

Завод-изготовитель планировщика должен быть глобальным для вашего приложения. Другими словами, объявите его в Global.asax или аналогичном, что эффективно дает вам глобальный экземпляр для работы. Вы должны запустить планировщик при запуске приложения, если вы используете ASP.NET.

Остерегайтесь мысли. ASP.NET перерабатывает свои процессы, которые эффективно приводят к остановке планировщика (никакие задания не будут выполняться), пока следующий веб-сервер не запустит следующий следующий запрос, чтобы снова запустить планировщик. Рекомендуемым способом является наличие службы Windows для выполнения заданий Quartz.NET.

+0

Большое спасибо. Вы правы, проблема была в вопросе ...! – Glinkot

+0

@MarkoLahma Спасибо, но насколько я знаю, Quartz.NET используется, чтобы не использовать Win Service. Итак, если мы должны использовать Win Service, нужно ли использовать Quartz.net? Есть ли другое решение на стороне приложения? Если да, можете ли вы привести пример для приложения MVC? –

+1

@Christof you * can * host Quartz внутри приложения ASP.NET, но он имеет свои подводные камни, как отмечено. Вы * должны * размещать Quartz.NET предпочтительно внутри службы Windows, а также иметь интерфейс управления с помощью ASP.NET MVC и т. Д., Который не запускает задания, просто управляет расписаниями и заданиями. –

Смежные вопросы