Quartz.Net—JobBuilder

JobBuilder

 JobBuilder是一个建造者模式,链式建造。通过静态方法构建一个JobBuilder实例,然后再调用类方法Build()创建一个IJobDetail的实现。

1、静态方法

public static JobBuilder Create()
{
    return new JobBuilder();
}

/// <summary>
/// Create a JobBuilder with which to define a <see cref="IJobDetail" />,
/// and set the class name of the job to be executed.
/// </summary>
/// <returns>a new JobBuilder</returns>
public static JobBuilder Create(Type jobType)
{
    JobBuilder b = new JobBuilder();
    b.OfType(jobType);
    return b;
}

/// <summary>
/// Create a JobBuilder with which to define a <see cref="IJobDetail" />,
/// and set the class name of the job to be executed.
/// </summary>
/// <returns>a new JobBuilder</returns>
public static JobBuilder Create<T>() where T : IJob
{
    JobBuilder b = new JobBuilder();
    b.OfType(typeof(T));
    return b;
}


/// <summary>
/// Create a JobBuilder with which to define a <see cref="IJobDetail" />,
/// and set the class name of the job to be executed.
/// </summary>
/// <returns>a new JobBuilder</returns>
public static JobBuilder CreateForAsync<T>() where T : IJob
{
    JobBuilder b = new JobBuilder();
    b.OfType(typeof(T));
    return b;
}

上面主要就是通过静态方法创建一个对象实例,或并且制定他的jobType  类型。既然是使用的类型,那么执行job任务的时候,一定是通过反射获取对象的。

下面试类方法,设置jobType类型的。

这种设计一个jobType的好处就是,任务第三方提供的任务,只要继承了  IJob接口的,都可以直接拿过来使用。

public JobBuilder OfType<T>()
{
    return OfType(typeof(T));
}

/// <summary>
/// Set the class which will be instantiated and executed when a
/// Trigger fires that is associated with this JobDetail.
/// </summary>
/// <returns>the updated JobBuilder</returns>
/// <seealso cref="IJobDetail.JobType" />
public JobBuilder OfType(Type type)
{
    jobType = type;
    return this;
}

2、StroreDurably    Job持久化 

默认情况下  job没有trigger的时候会被删除,

IJobDetail job = JobBuilder.Create<MyJob2>().StoreDurably(true).Build();

设置为true则不会删除。

 

job和trigger都是存在ramjobstore这个里面。

3、job名字

/// <summary>
/// Use a <see cref="JobKey" /> with the given name and default group to
/// identify the JobDetail.
/// </summary>
/// <remarks>
/// <para>If none of the 'withIdentity' methods are set on the JobBuilder,
/// then a random, unique JobKey will be generated.</para>
/// </remarks>
/// <param name="name">the name element for the Job's JobKey</param>
/// <returns>the updated JobBuilder</returns>
/// <seealso cref="JobKey" /> 
/// <seealso cref="IJobDetail.Key" />
public JobBuilder WithIdentity(string name)
{
    key = new JobKey(name, null);
    return this;
}

/// <summary>
/// Use a <see cref="JobKey" /> with the given name and group to
/// identify the JobDetail.
/// </summary>
/// <remarks>
/// <para>If none of the 'withIdentity' methods are set on the JobBuilder,
/// then a random, unique JobKey will be generated.</para>
/// </remarks>
/// <param name="name">the name element for the Job's JobKey</param>
/// <param name="group"> the group element for the Job's JobKey</param>
/// <returns>the updated JobBuilder</returns>
/// <seealso cref="JobKey" />
/// <seealso cref="IJobDetail.Key" />
public JobBuilder WithIdentity(string name, string group)
{
    key = new JobKey(name, group);
    return this;
}

/// <summary>
/// Use a <see cref="JobKey" /> to identify the JobDetail.
/// </summary>
/// <remarks>
/// <para>If none of the 'withIdentity' methods are set on the JobBuilder,
/// then a random, unique JobKey will be generated.</para>
/// </remarks>
/// <param name="key">the Job's JobKey</param>
/// <returns>the updated JobBuilder</returns>
/// <seealso cref="JobKey" />
/// <seealso cref="IJobDetail.Key" />
public JobBuilder WithIdentity(JobKey key)
{
    this.key = key;
    return this;
}
View Code

就是制定job的名子,这里名字类型为JobKey。如果没有指定名字,则在Builder的时候制定一个GUID

if (key == null)
{
key = new JobKey(Guid.NewGuid().ToString(), null);
}

4、附加信息  UsingJobData     SetJobData

构建job的时候可以指定一些附加信息,然后再job方法中可以拿到这些i信息。

IJobDetail job = JobBuilder.Create<MyJob2>().StoreDurably(true).WithIdentity("ceshi2").UsingJobData("zangfeng","123").Build();

public class MyJob2 : IJob
{

    public Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine(context.JobDetail.JobDataMap["zangfeng"]);
        return Task.Factory.StartNew(() => Console.WriteLine($"工作任务测试2:{DateTime.Now.ToString("yyyy-MM-dd
HH:mm:ss")}"));
    }
}

 5、创建  Build

public IJobDetail Build()
{
    JobDetailImpl job = new JobDetailImpl();

    job.JobType = jobType;
    job.Description = description;
    if (key == null)
    {
        key = new JobKey(Guid.NewGuid().ToString(), null);
    }
    job.Key = key;
    job.Durable = durability;
    job.RequestsRecovery = shouldRecover;


    if (!jobDataMap.IsEmpty)
    {
        job.JobDataMap = jobDataMap;
    }

    return job;
}

就是返回一个IJobDetail的实现JobDetailImpl,并初始化这个类型

posted @ 2018-03-02 10:59  西伯利亚的狼  阅读(2229)  评论(0编辑  收藏