Asp.net 如何使用任务调度

首先需要再 Global文件中,创建调度器,哎呀,直接上代码吧

cs 复制代码
public class MvcApplication : System.Web.HttpApplication
{
    private static IScheduler _scheduler;
    private ScheduleJobsManager  _jobMana;
    protected void Application_Start()
    {
        

        var factory = new StdSchedulerFactory();
       
        _scheduler = factory.GetScheduler();
        _scheduler.Start();
        _jobMana = new ScheduleJobsManager(_scheduler);
      
        RegisterJobs();




       


    }

//在网站启动的时候,将数据库中正在运行状态的任务,启动起来
 private  void RegisterJobs()
 {
     var list = _jobMana.GetList(s => s.JobStatus == "Running");
     foreach (var job in list)
     {
         _jobMana.AddJob(job);

     }

 }

//这个方法,是在其他地方使用的,相当于 单例模式,全局只有这一个调度器
 public static IScheduler GetScheduler()
 {
     return _scheduler;
 }

}

接下来说下,管理任务调度的控制器和界面

控制器这样写:

cs 复制代码
 private  IScheduler _scheduler = MvcApplication.GetScheduler();//这个就是Global中的那个静态方法
 private ScheduleJobsManager _scheduleJobsManager; //这个是对任务调度的一个封装,也是操作数据的操作类,后面会给代码
 private JobLogsManager _jobLog = new JobLogsManager();  //这个是与数据库对用的Job日志操作类

//初始化控制器,需要给调度管理进行初始化
 public JobController()
 {
     _scheduleJobsManager = new ScheduleJobsManager(_scheduler);
 }


 public ActionResult Add(ScheduleJobs job)
 {
     job.JobStatus = "Running";
     job.CreateTime = DateTime.Now;
     _scheduleJobsManager.Insert(job);

     _scheduleJobsManager.AddJob(job);



     return Json(new { code = 0, msg = "添加成功" });
 }

 public ActionResult Pause(int id)
 {
     try
     {
        if( _scheduleJobsManager.PauseJob(id))
         {
             return Json(new { code = 0, msg = "暂停成功" });
         }
         else
         {
             return Json(new { code = 500, msg = "暂停失败" });
         }
        
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "暂停失败:" + ex.Message });
     }
 }



 [HttpPost]
 public ActionResult Resume(int id)
 {
     try
     {
         if(_scheduleJobsManager.ResumeJob(id))
         {
             return Json(new { code = 0, msg = "恢复成功" });
         }
         return Json(new { code = 500, msg = "恢复失败"  });
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "恢复失败:" + ex.Message });
     }
 }



 [HttpPost]
 public ActionResult Delete(int Id)
 {
     var info = _scheduleJobsManager.GetById(Id);
     if (_scheduleJobsManager.Delete(s => s.Id == Id))
     {
         _scheduleJobsManager.DeleteJob(info);
         return Json(new { code = 0, msg = "删除成功" });
     }
     else
     {
         return Json(new { code = -1, msg = "删除失败" });
     }
 }


 [HttpPost]
 public ActionResult Edit(ScheduleJobs job)
 {
     var existingJob =_scheduleJobsManager.GetById(job.Id);
     if (existingJob == null)
         throw new Exception("任务不存在");

     try
     {
         // 删除旧的任务
          _scheduler.DeleteJob(new JobKey(existingJob.JobName, existingJob.JobGroup));

         // 创建新的任务
         _scheduleJobsManager.AddJob(job);
         existingJob.JobName = job.JobName;
         existingJob.JobGroup = job.JobGroup;
         existingJob.JobClassName = job.JobClassName;
         existingJob.AssemblyName = job.AssemblyName;
         existingJob.CronExpression = job.CronExpression;
         existingJob.Description = job.Description;
         
         _scheduleJobsManager.Update(existingJob);
         return Json(new { code = 0, msg = "更新成功" });
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "更新失败:" + ex.Message });
     }
 }

ScheduleJobsManager.cs

cs 复制代码
public class ScheduleJobsManager : DbContext<ScheduleJobs>
{

    //当前类已经继承了 DbContext增、删、查、改的方法
    private readonly IScheduler _scheduler ;
    public ScheduleJobsManager(IScheduler scheduler) {
        _scheduler = scheduler ;
    }

    public void RunJobOnce(int id)
    {
        var job = GetById(id);
        if (job == null)
            throw new Exception("任务不存在");

        var jobKey = new JobKey(job.JobName, job.JobGroup);
        _scheduler.TriggerJob(jobKey);
    }

    private IJobDetail CreateJobDetail(ScheduleJobs jobInfo)
    {
        // 获取任务类型
        Type jobType;
        if (string.IsNullOrEmpty(jobInfo.AssemblyName))
        {
            // 从当前程序集获取类型
            jobType = Type.GetType(jobInfo.JobClassName);
        }
        else
        {
            // 从指定程序集加载类型
            var assembly = Assembly.Load(jobInfo.AssemblyName);
            jobType = assembly.GetType(jobInfo.JobClassName);
        }

        if (jobType == null)
        {
            throw new Exception($"找不到任务类型:{jobInfo.JobClassName}");
        }

        // 验证类型是否实现IJob接口
        if (!typeof(IJob).IsAssignableFrom(jobType))
        {
            throw new Exception($"任务类型 {jobInfo.JobClassName} 必须实现IJob接口");
        }

        // 创建任务详情
        return JobBuilder.Create(jobType)
            .WithIdentity(jobInfo.JobName, jobInfo.JobGroup)
            .WithDescription(jobInfo.Description)
            .UsingJobData("jobId", jobInfo.Id)  // 传递任务ID
            .Build();
    }

    public void AddJob(ScheduleJobs job)
    {
        try
        {
            // 创建任务
            var jobDetail = CreateJobDetail(job);

            var trigger = TriggerBuilder.Create()
                .WithIdentity($"{job.JobName}_trigger", job.JobGroup)
                .WithCronSchedule(job.CronExpression)
                .Build();

            // 添加到调度器
            _scheduler.ScheduleJob(jobDetail, trigger);

        }
        catch (Exception ex)
        {
            throw new Exception($"添加任务失败: {ex.Message}", ex);
        }
    }

    public bool PauseJob(int id)
    {
        
        var job = GetById(id);
         _scheduler.PauseJob(new JobKey(job.JobName, job.JobGroup));
        job.JobStatus = "Paused";
        return Update(job);



    }

    public bool ResumeJob(int id)
    {
       
        
            var job = GetById(id);
            _scheduler.ResumeJob(new JobKey(job.JobName, job.JobGroup));
            job.JobStatus = "Running";
            return Update(job);
           
          
        
    }

    public void DeleteJob(ScheduleJobs job)
    {
        
       
             _scheduler.DeleteJob(new JobKey(job.JobName, job.JobGroup));
           
        
    }


  
 
}

View界面就是简单的添加修改删除,用的layui框架做的,这个就做代码了,自己用自己的框架做吧

相关推荐
budingxiaomoli3 天前
Spring Web MVC 知识总结
spring·mvc
虾米Life4 天前
MVC与MVVM 架构
架构·mvc·mvvm
笛卡尔的心跳6 天前
Spring MVC 注解
java·spring·mvc
小松加哲6 天前
Spring MVC 核心原理全解析
java·spring·mvc
那个失眠的夜7 天前
RESTful 语法规范 核心注解详解
java·spring·mvc·mybatis
羌俊恩7 天前
Centos环境django项目部署过程
django·flask·centos·mvc·mtv·web项目框架
__土块__8 天前
AI 任务调度器频繁超时:一次从线程争用到执行隔离的工程复盘
线程池·可观测性·任务调度·系统稳定性·生产故障·ai工程·执行隔离
Foreer黑爷9 天前
Spring MVC原理与源码:从请求到响应的全流程解析
java·spring·mvc
曹牧10 天前
Spring MVC中使用HttpServletRequest和HttpServletResponse
java·spring·mvc
曹牧10 天前
Spring MVC配置文件
java·spring·mvc