Триггерное событие Quartz.Net - PullRequest
1 голос
/ 07 июня 2011

У меня есть свой ITrigger.По сути, это выглядит следующим образом:

public interface ITrigger : IDisposable
{
    /// <summary>
    /// Occurs when an input has been trigger.
    /// </summary>
    event InputTriggedEventHandler InputTrigged;
    /// <summary>
    /// Starts the trigger.
    /// </summary>
    /// <param name="trigger">The data about the trigger to start.</param>
    void Init(Trigger trigger);
}

Одна реализация этого интерфейса - FileCreatedTrigger, которая запускает событие при создании файла.

Я хочу другую реализацию, где я могуустановите Trigger на определенный интервал времени (очень похоже на планировщик заданий Windows).Итак, я посмотрел на Quartz.Net , и это почти то, что я хочу.

Вопрос в том, Как мне получить событие InputTrigged для запуска из IJob? , который использует Кварц.IJob реализует только execute, который не может вызвать родителя (который в данном случае является ITrigger, так как он не знает, какой это экземпляр.

Надеюсь, я дал понять, что хочу.интерфейс ITrigger при использовании Quartz.Net, в котором есть другая реализация триггера.

1 Ответ

0 голосов
/ 08 июня 2011

То, что я в конечном итоге делал, держало статическую ссылку на ScheduleTriggers с guid в качестве ключа. Затем guid передается в jobdetail, который использует его для поиска ScheduleTrigger и вызывает событие. Не красиво, но делает работу:

public class ScheduleTrigger : BaseTrigger
    {
        Guid name = Guid.NewGuid();
        static Dictionary<Guid, ScheduleTrigger> triggers = new Dictionary<Guid, ScheduleTrigger>();
        public static Dictionary<Guid, ScheduleTrigger> Triggers
        {
            get
            {
                return triggers;
            }
        }
        public void Init(Trigger triggerParam)
        {
           ....
           JobDetail jobDetail = new JobDetail(name.ToString(), Type.GetType(schedTrig.JobType.JobClassName));
           Triggers.Add(name, this);
        }
        public void Dispose()
        {
            if (Triggers.ContainsKey(name))
            {
                triggers.Remove(name);
            }
            base.Dispose();
        }

        internal void RaiseEvent()
        {
            base.OnInputTrigged(string.Empty);
        }
   }

И очень простая работа по организации мероприятия

   EventRaiserJob : IJob
   {
       public void Execute(JobExecutionContext context)
       {
           Guid name = new Guid(context.JobDetail.Name);
           ScheduleTrigger.Triggers[name].RaiseEvent();
       }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...