Quartz.Net触发事件

时间:2011-06-07 12:18:58

标签: c# events quartz-scheduler

我有自己的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,这几乎是我想要的。

问题是如何从IJob 触发InputTrigged事件?这是Quartz使用的。 IJob只实现了无法调用父节点的执行(在这种情况下是ITrigger,因为它不知道它是哪个实例。

希望我明白自己。我希望能够在使用ITrigger时保持我的界面Quartz.Net,{{1}}具有另一种如何触发的实现。

1 个答案:

答案 0 :(得分:0)

我最终做的是保持对使用guid作为键的ScheduleTriggers的静态引用。然后将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();
       }
   }