Долгосрочные работы в Quartz.Net - PullRequest
1 голос
/ 10 сентября 2009

У меня есть работа в Quartz.Net, которая срабатывает довольно часто, а иногда и долго, как мне отменить триггер, если задание уже запущено?

Ответы [ 5 ]

2 голосов
/ 12 сентября 2009

Более стандартный способ - использовать IInterruptableJob, см. http://quartznet.sourceforge.net/faq.html#howtostopjob. Конечно, это просто еще один способ сказать, если (! JobRunning) ...

1 голос
/ 10 сентября 2009

Не могли бы вы просто установить какую-то глобальную переменную (jobRunning = true) при запуске задания и вернуть его в false после завершения?

Затем, когда сработает триггер, просто запустите ваш код if (jobRunning == false)

0 голосов
/ 30 января 2014

Это была моя реализация (с использованием предложений по ссылке, которую MarkoL дал ранее).

Я просто пытаюсь сохранить набор текста.

Я довольно новичок в Quartz.NET, так что возьмите приведенное ниже с поездом соли.

public class AnInterruptableJob : IJob, IInterruptableJob
{

    private bool _isInterrupted = false;

    private int MAXIMUM_JOB_RUN_SECONDS = 10;

    /// <summary> 
    /// Called by the <see cref="IScheduler" /> when a
    /// <see cref="ITrigger" /> fires that is associated with
    /// the <see cref="IJob" />.
    /// </summary>
    public virtual void Execute(IJobExecutionContext context)
    {


        /* See http://aziegler71.wordpress.com/2012/04/25/quartz-net-example/ */

        JobKey key = context.JobDetail.Key;

        JobDataMap dataMap = context.JobDetail.JobDataMap;

        int timeOutSeconds = dataMap.GetInt("TimeOutSeconds");
        if (timeOutSeconds <= 0)
        {
            timeOutSeconds = MAXIMUM_JOB_RUN_SECONDS;
        }

        Timer t = new Timer(TimerCallback, context, timeOutSeconds * 1000, 0);


        Console.WriteLine(string.Format("AnInterruptableJob Start : JobKey='{0}', timeOutSeconds='{1}' at '{2}'", key, timeOutSeconds, DateTime.Now.ToLongTimeString()));


        try
        {
            Thread.Sleep(TimeSpan.FromSeconds(7));
        }
        catch (ThreadInterruptedException)
        {
        }


        if (_isInterrupted)
        {
            Console.WriteLine("Interrupted.  Leaving Excecute Method.");
            return;
        }

        Console.WriteLine(string.Format("End AnInterruptableJob (should not see this) : JobKey='{0}', timeOutSeconds='{1}' at '{2}'", key, timeOutSeconds, DateTime.Now.ToLongTimeString()));

    }


    private void TimerCallback(Object o)
    {
        IJobExecutionContext context = o as IJobExecutionContext;

        if (null != context)
        {
            context.Scheduler.Interrupt(context.FireInstanceId);
        }
    }

    public void Interrupt()
    {
        _isInterrupted = true;
        Console.WriteLine(string.Format("AnInterruptableJob.Interrupt called at '{0}'", DateTime.Now.ToLongTimeString()));
    }
}
0 голосов
/ 26 ноября 2013

В настоящее время вы можете использовать «WithMisfireHandlingInstructionIgnoreMisfires» в своем триггере и использовать атрибут [DisallowConcurrentExecution] в своей работе.

0 голосов
/ 10 сентября 2009

Ваше приложение может удалить себя из списка заданий при запуске и вставить себя при завершении работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...