项目实战|C#Socket通讯方式改造(二)--利用Quartz实现定时任务处理

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为3404,预计阅读9分钟

前言

上一篇《项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载》我们简单介绍了项目的背景及需要实现新的方式时利用Socket针对Ftp服务器实现文件的上传和下载,因为方式由原来的实时通讯改为每天的定时通讯,所以我们这篇就来看一下怎么实现定时任务的使用。

项目分析

微卡智享

Quartz实现任务定时处理

微卡智享

其实要实现定时任务处理的方式有比较多的,如直接加一个Timer进行处理,或是做一个Windows服务等,我也是看了一些相关的文章,再做了一下对比后,决定使用Quartz框架的,主要是方便,也快速实现。

实现效果

代码实现

01

创建项目

我们的项目后台用的WebApi所以我们建的这个项目也是WebApi的项目,创建好后基本目录

02

安装Quartz框架

打开管理NuGet程序包,我们搜索Quartz,然后点击安装

因为当时给客户开发的时候用的是.netframework4.5,所以我就装了2.6.2的版本,3.0的版本后需要是.netframework4.5.2以上才可以。

03

生成文件的方法类(TaskDo)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;


namespace QuartzDemo
{
    /// <summary>
    /// 处理做的事
    /// </summary>
    public class TaskDo
    {
        static string filePath = @"D:\IISTest";


        public static void CreateFile()
        {
            Random rd = new Random();
            int count = rd.Next(0, 200);


            //判断路径是否存在,不存在创建
            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(filePath);
            }


            //将循环完后拼接好的字符串保存到txt文件里,文件名为用户控件名称
            string filename = filePath + "\\file" + count + ".txt";


            StringBuilder sb = new StringBuilder();
            //写入数据
            for (int i = 0; i < count; ++i)
            {
                sb.Append("data:" + i + "|" + DateTime.Now.ToString());
            }
            File.WriteAllText(filename, sb.ToString(), Encoding.UTF8);
        }
    }
}

完成上面的后,我们就开始真正使用Quartz框架了

使用Quartz框架

01

创建任务

创建一个类继承自IJob的接口,然后实现接口中的Execute的方法

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace QuartzDemo
{
    /// <summary>
    /// 创建QuartzJob的类继承IJOB的接口,在Execute中加入实现方法
    /// </summary>
    public class QuartzJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            //调用TaskDo下面的生成文件方法
            TaskDo.CreateFile();
        }
    }
}

02

创建任务调度类

新建一个任务调度类,用于供外部调用。

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace QuartzDemo
{
    /// <summary>
    /// 创建任务调度类
    /// </summary>
    public class QuartzJobScheduler
    {
        public static void Start()
        {
            //调度器工厂
            ISchedulerFactory factory = new StdSchedulerFactory();
            //调度器
            IScheduler scheduler = factory.GetScheduler();
            scheduler.GetJobGroupNames();


            //计划任务代码实现
            //1.创建任务,调用QuartzJob的类
            IJobDetail detail = JobBuilder.Create<QuartzJob>().Build();
            IJobDetail detail1 = JobBuilder.Create<ListenIISJob>().Build();


            //2.创建触发器
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("Job", "Upload")
                .WithSimpleSchedule(
                t => t.WithIntervalInSeconds(60).RepeatForever())
                .Build();
            ITrigger trigger1 = TriggerBuilder.Create()
                .WithIdentity("IIS", "ListenIIS")
                .WithSimpleSchedule(
                t => t.WithIntervalInMinutes(1).RepeatForever())
                .Build();




            //3.添加任务及触发器至调度中
            scheduler.ScheduleJob(detail, trigger);
            scheduler.ScheduleJob(detail1, trigger1);


            //启动
            scheduler.Start();


        }
    }
}

上面的触发器中WithIntervalInSeconds(60)就是设置的间隔时间60秒,这里可以看一下还有分钟,小时的参数,根据这个可以自己设定。

03

设置IIS启动时注册任务

在Global.asax的Application_Start()中加入

//注册定时任务
            QuartzJobScheduler.Start();

这样我们的任务调用就可以完成了,效果如下

TIPS

IIS网站应用程序池中默认的闲置超时为20分钟,如果20分钟没有任务调用API,那我们做的Quartz任务也会被回收,不再启动,所有我们在Demo中又加了一个开启的任务,每隔多少时间调用一次网站,上图代码已经有了,这里把IIS的Job也列一下

using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;


namespace QuartzDemo
{
    public class ListenIISJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:8080/");
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
                string desc = rsp.StatusDescription;
                StringBuilder sb = new StringBuilder();
                sb.Append("request" + DateTime.Now.ToString() + "\r\n");


                string file = @"D:\IISTest\request.txt";
                File.AppendAllText(file, sb.ToString(), Encoding.UTF8);
                
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载

开源|OpenCV结合A*及JPS算法室内路径规划

OpenCV DNN换新笔记本后的速度对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值