技术 思绪 摘录 旅行
接触Quartz.net也是因为之前用的Time组件不是很稳定,发现Time组件跑一段时间,就出现假死不动了,导致任务调度中断,本文主要记录使用的案例。

Quartz.net  的原理可以移步深入解读Quartz的原理,写的很好,很详细。


1、创建一个4.5.2的控制台程序为最佳。

2、nuget引用Quartz.net 3.0.7为最佳。

3、配置一个执行调度的时间。

             /** Cron表达式
             http://www.bejson.com/othertools/cronvalidate/
             * 15 0/1 * * * ? 每分钟的第15秒执行
             * 0/15 * * * * ? 每15秒运行一次
             * 0 0 1 * * ? 每日凌晨一点执行一次
             * 0 0 0 * * ? 每日凌晨12点执行一次待验证
             * 0 0 1 ? * WED 每周三 凌晨1点执行
             * 0 0 2 1 * ?  每月1号凌晨2点执行一次
             */
    <!--自动取消订单 10秒一次-->
    <add key="AutoCancelOrdTime" value="0/10 * * * * ?" />


准备工作完毕,直接上代码。


using Quartz;
using Quartz.Impl;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;

namespace Go.Campuses.Order.AutoTask
{
    public partial class AutoOrder : Form
    {
        /// <summary>
        /// The scheduler
        /// </summary>
        IScheduler _scheduler = null;
        /// <summary>
        /// 自动取消订单定时配置
        /// </summary>
        public static readonly  string AutoCancelOrdTime =ConfigHelper.GetConfigToString("AutoCancelOrdTime");//   0/10 * * * * ?   10秒钟执行一次
        public AutoOrder()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 加载事件
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void AutoCancelOrd_Load(object sender, EventArgs e)
        {
            Thread taskThread = new Thread(StartTask);
            taskThread.Start();
            string v = AppDomain.CurrentDomain.BaseDirectory.Split(new char[] {Path.DirectorySeparatorChar},StringSplitOptions.RemoveEmptyEntries).Last();

            RichTextBox.AppendText($"                {v}           \r\n");
            RichTextBox.AppendText($"自动取消未支付订单任务-启动成功\r\n");
        }

        
        /// <summary>
        ///启动任务
        /// </summary>
        private async void StartTask()
        {
            ISchedulerFactory sf = new StdSchedulerFactory();

            if (_scheduler == null)
            {
                _scheduler = await sf.GetScheduler();
            }

            await _scheduler.Start();

            #region 自动取消未支付订单
            //创建任务对象
            IJobDetail job1 = JobBuilder.Create<EveryAutoCancelOrdJob>().WithIdentity("job1", "group1").Build();
            //创建触发器
            ITrigger trigger1 = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithCronSchedule(AutoCancelOrdTime).Build();
            #endregion
            await _scheduler.ScheduleJob(job1, trigger1);
        }
    }
}


还需要一个EveryAutoCancelOrdJob任务类。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Go.Campuses.Order.NetWork.WcfHelper;
using Quartz;

namespace Go.Campuses.Order.AutoTask.Comm
{

    /// <summary>
    ///自动取消未支付订单任务类
    /// </summary>
    /// <seealso cref="Quartz.IJob" />
    public class EveryAutoCancelOrdJob : IJob
    {
        /// <summary>
        /// 作业调度定时执行的方法
        /// </summary>
        /// <param name="context">The execution context.</param>
        /// <returns>Task.</returns>
        /// <remarks>The implementation may wish to set a  result object on the
        /// JobExecutionContext before this method exits.  The result itself
        /// is meaningless to Quartz, but may be informative to
        /// <see cref="T:Quartz.IJobListener" />s or
        /// <see cref="T:Quartz.ITriggerListener" />s that are watching the job's
        /// execution.</remarks>
        public virtual Task Execute(IJobExecutionContext context)
        {
            return Task.Factory.StartNew(() =>
            {
                EveryTask();
            });
        }

        /// <summary>
        ///任务实现 直接调用服务或者具体逻辑代码
        /// </summary>
        public void EveryTask()
        {
            try
            {
                Result ret = WcfHelper.AutoCancelOrd();
            }
            catch
            {

            }
        }

    }
}


欢迎大家伙儿交流和提出问题!


CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

友情打赏

请打开您的微信,扫一扫