简体   繁体   English

Quartz.Net 触发事件

[英]Quartz.Net trigger event

I have my own ITrigger .我有自己的ITrigger Basically, it looks like the below:基本上,它如下所示:

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

One implementation of this interface is a FileCreatedTrigger which fires the event when a file is created.此接口的一种实现是FileCreatedTrigger ,它在创建文件时触发事件。

I want another implementation where I can set the Trigger to fire at a certain interval (much like the Windows Task Scheduler).我想要另一个实现,我可以将Trigger设置为以特定间隔触发(很像 Windows 任务调度程序)。 So, I looked at the Quartz.Net and it's pretty much what I want.所以,我查看了Quartz.Net ,这正是我想要的。

The question is How do I get the InputTrigged event to fire from an IJob ?问题是如何让 InputTrigged 事件从IJob which is what Quartz uses.这就是石英使用的。 The IJob only implements execute which cannot call the parent (which is in this case the ITrigger as it does not know which instance this is. IJob 仅实现无法调用父级的执行(在本例中为ITrigger ,因为它不知道这是哪个实例。

Hope I made myself clear.希望我说清楚了。 I want to be able to keep my interface ITrigger while using Quartz.Net which has another implementation of how to trigger.我希望能够在使用Quartz.Net时保留我的接口ITrigger ,它具有如何触发的另一种实现。

What I ended up doing was keeping a static reference to the ScheduleTriggers with guid as key.我最终做的是保持 static 对 ScheduleTriggers 的引用,其中 guid 作为键。 The guid is then passed to the jobdetail which uses it to find the ScheduleTrigger and raises the event.然后将 guid 传递给 jobdetail,后者使用它来查找 ScheduleTrigger 并引发事件。 Not pretty, but does the job:不漂亮,但工作:

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

And the very simple job to raise the event以及引发事件的非常简单的工作

   EventRaiserJob : IJob
   {
       public void Execute(JobExecutionContext context)
       {
           Guid name = new Guid(context.JobDetail.Name);
           ScheduleTrigger.Triggers[name].RaiseEvent();
       }
   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM