如何在Quartz.Net中创建一个JobHandler?

时间:2012-01-12 00:37:37

标签: c# quartz-scheduler

我有一个实例化Quartz Scheduler的控制台应用程序 我想要一个Job来引发一个事件处理程序,以便“母亲应用程序”调用一个特定的方法 问题是,Job Class似乎与外部类很相似。我相信有一个很好的方法可以做到这一点,但我还没有发现它。

public class RestartJob : IJob
{        
    public RestartJob()
    {
    }

    public virtual void Execute(IJobExecutionContext context)
    {
        //Send Restart EventHandler Subscription to Console.            
    }
}

3 个答案:

答案 0 :(得分:3)

我通过在包含Scheduler Logic的类上实现单例解决了我的问题。 有魅力。希望这可以帮助其他人解决我认为的“必备”功能。

public class Skeduler
{
    private static Skeduler instance;

    public static Skeduler Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Skeduler();
            }
            return instance;
        }
    }

    public delegate void SendRestartX();
    public event SendRestartX SendRestart;

    public void doSendRestart()
    {
        if (SendRestart!=null)
            SendRestart();
    }

    //(Job Methods & Logics Goes Here)

 }

public class RestartJob : IJob
{
    //Required
    public RestartJob()
    {
    }

    public virtual void Execute(IJobExecutionContext context)
    {
        Skeduler.Instance.doSendRestart();
    }

}

用法:

    public MainClass
    {   
        public void Run()
        {
          skeduler = Skeduler.Instance;
          skeduler.SendRestart += new Skeduler.SendRestartX(MethodToCall);
        }
    }

答案 1 :(得分:2)

您可以在JobDataMap中传递事件处理程序,然后使用作业中的事件处理程序。

创建工作时

IJobDetail job = JobBuilder.Create<RestartJob>().WithIdentity("job"), "group")
        .SetJobData(new JobDataMap{{"event-handler", YourEventHandler}});

在你的工作班上:

public class RestartJob : IJob
{        
    public RestartJob()
    {
    }

    public virtual void Execute(IJobExecutionContext context)
    {
        var @event = context.JobDetail.JobData["event-handler"];
        @event?.Invoke(YourEventParameters); 
    }
}

答案 2 :(得分:1)

你可以试试这个: 创建IJobDetail:

IJobDetail job = JobBuilder.Create<LogJob>().WithIdentity("job"), "group")
        .UsingJobData("id", 123).Build();
job.JobDataMap["SOMENAME"] = this;

用法:

public void Execute(IJobExecutionContext context) {
    JobDataMap dataMap = context.JobDetail.JobDataMap;
    CLASSNAME SOMENAME = dataMap["SOMENAME"] as MediaPlaylistsAds;
    int id = (int)dataMap["id"];
    SOMENAME.SOMEFUNC(id);
}