当前位置: 首页 > article >正文

MVC如何使用任务调度

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

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;
 }

}

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

控制器这样写:

 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

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框架做的,这个就做代码了,自己用自己的框架做吧


http://www.kler.cn/a/503593.html

相关文章:

  • 基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)
  • C# OpenCV机器视觉:转速测量
  • 30天开发操作系统 第 12 天 -- 定时器 v1.0
  • 30_Redis哨兵模式
  • 面试:类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?
  • 【C++】string的关系运算与比较分析
  • 基于springboot航空售票及管理系统
  • Duke Humanoid:利用被动动力学实现节能双足机器人
  • PyTorch 中的 Dropout 解析
  • 1.14寒假作业
  • Logback日志技术
  • 信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
  • 2501,VC++接口函数总结
  • Python Wi-Fi密码测试工具
  • 从根源上解决cursor免费版50次限制问题
  • 【pycharm】远程部署失败,查看日志
  • zookeeper 基本原理-单机模式、集群模式
  • Three.js 性能优化:打造流畅高效的3D应用
  • 基于YOLOv8的高空无人机小目标检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型
  • wordpress 房产网站筛选功能
  • CRMEB多商户商城系统JAVA版 B2B2C商家入驻平台系统独立版全开源
  • aws(学习笔记第二十四课) 使用sam开发step functions
  • 3D目标检测数据集——Waymo数据集
  • 【Rust自学】12.6. 使用TDD(测试驱动开发)开发库功能
  • 无人机飞手考证难度提升,地面站培训技术详解
  • 《深入理解Mybatis原理》Mybatis中的缓存实现原理