4

ASP.NET MVC 4 アプリケーションで Quartz.net 2.0 を使用してタスクをスケジュールしようとしていますが、タスクを実行できません。

コードは次のとおりです。

public class ScheduleTaskConfig
{
    public static void StartScheduler()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();

        IScheduler scheduler = schedulerFactory.GetScheduler();

        JobKey emailSenderTaskKey = new JobKey("emailSenderTask", "email");
        IJobDetail emailSenderTask = JobBuilder.Create<QueuedEmailsSendTask>()
            .WithIdentity(emailSenderTaskKey)
            .Build();

        TriggerKey emailSenderTriggerKey = new TriggerKey("emailSenderTrigger", "email");
        ITrigger emailSenderTrigger = TriggerBuilder.Create()
            .WithIdentity(emailSenderTriggerKey)
            .WithSimpleSchedule(s => s.RepeatForever().WithIntervalInSeconds(5))
            .StartNow()
            .Build();

        scheduler.ScheduleJob(emailSenderTask, emailSenderTrigger);
        scheduler.Start();
    }
}

global.asax アプリケーション起動時に呼び出されます

protected void Application_Start()
{
    ScheduleTaskConfig.StartScheduler();
    ...
}

IJob インターフェイスを実装するクラスは次のとおりです。

public class QueuedEmailsSendTask : IJob
{
    private IQueuedEmailsService _queuedEmailsService { get; set; }
    private IEmailSenderService _emailSenderService { get; set; }

    public QueuedEmailsSendTask(IQueuedEmailsService queuedEmailsService, IEmailSenderService emailSenderService)
    {
        this._queuedEmailsService = queuedEmailsService;
        this._emailSenderService = emailSenderService;
    }

    public void Execute(IJobExecutionContext executeContext)
    {
        //do stuff ...
    }
}

Execute メソッドの先頭にブレークポイントを配置しましたが、デバッガーはそこで停止しません。私は何を間違っていますか?

更新: デフォルトのコンストラクターを持たない IJob インターフェイスを実装するクラスと関係があります。次のようにコンストラクターを変更すると、機能します。

public QueuedEmailsSendTask()
{
}

しかし、依存関係を注入できる必要があります。Autofac IoC コンテナーを使用しています。

4

3 に答える 3

1

スケジューラーを起動した後、ジョブのスケジューリングを試みましたか?

public class ScheduleTaskConfig
{
    public static void StartScheduler()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();

        IScheduler scheduler = schedulerFactory.GetScheduler();
        scheduler.Start(); //start here   

        //construct job info

        scheduler.ScheduleJob(emailSenderTask, emailSenderTrigger); //schedule here
    }
}
于 2013-05-20T20:09:56.167 に答える
0

AutofacJobFactoryがジョブのインスタンス化を担当していることを確認する必要があります。これは、JobBuilderオブジェクトを使用しないことを意味します。代わりに、スケジューラによって作成されるジョブの詳細をオブジェクトAutofacJobFactoryの形式で渡す必要がありJobDetailImpl ます。作業コードは次のようになります。

ISchedulerFactory schedulerFactory = new StdSchedulerFactory();

IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.JobFactory = new AutofacJobFactory(container);
scheduler.Start(); //start here  

// construct job info
JobDetailImpl jobDetail = new JobDetailImpl("emailSenderTask", null, typeof(QueuedEmailsSendTask));

TriggerKey emailSenderTriggerKey = new TriggerKey("emailSenderTrigger", "email");
ITrigger emailSenderTrigger = TriggerBuilder.Create()
    .WithIdentity(emailSenderTriggerKey)
    .WithSimpleSchedule(s => s.RepeatForever().WithIntervalInSeconds(5))
    .StartNow()
    .Build();

sched.ScheduleJob(jobDetail, trigger);

完全な例については、次の質問を参照してください

于 2013-06-04T04:15:26.377 に答える