.Net Core 에서 Quartz.Net 실천 기록 사용

7398 단어 .netcorequartz.net
소개
Quartz.NET 은 강력 하고 개원 적 이 며 가 벼 운 작업 스케줄 링 프레임 워 크 로 OpenSymphony 의 Quartz API 의.NET 이식 으로 C\#로 고 쳐 서 winform 과 asp.net 응용 에 사용 할 수 있 습 니 다.그것 은 유연 하지만 복잡 하지 않다.너 는 그것 으로 작업 을 수행 하기 위해 간단 하거나 복잡 한 작업 스케줄 을 만 들 수 있다.데이터베이스 지원,클 러 스 터,플러그 인,cron-like 표현 식 지원 등 여러 가지 특징 이 있 습 니 다.
예 를 들 어 매일 저녁 2 시 에 프로그램 이나 사이트 에 코드 를 실행 시 키 거나 5 초 간격 으로 새로운 작업 이 있 는 지 확인 하고 싶 습 니 다.
Quartz.Net 은 자바 의 Quartz 를 C\#로 고 쳐 쓴 것 으로 최신 버 전 은 3.0.6 이 고 소스 코드 는https://github.com/quartznet/quartznet에 있다. ( 로 컬 다운로드 )。
실천 강좌
WebApi 프로젝트 의 예 를 들 어 VS 비계 기능 으로 WebApi 프로젝트 를 새로 만 듭 니 다.

public void ConfigureServices(IServiceCollection services)
{
 services.AddMvc();
 services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();//  ISchedulerFactory   。
 }

[Route("api/[controller]")]
 public class ValuesController : Controller
 {
 private readonly ISchedulerFactory _schedulerFactory;
 private IScheduler _scheduler;
 public ValuesController(ISchedulerFactory schedulerFactory)
 {
  this._schedulerFactory = schedulerFactory;
 }
 [HttpGet]
 public async Task<string[]> Get()
 {
       //1、           
  _scheduler = await _schedulerFactory.GetScheduler();
       //2、     
  await _scheduler.Start();
       //3、       
  var trigger = TriggerBuilder.Create()
    .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//       
    .Build();
       //4、    
  var jobDetail = JobBuilder.Create<MyJob>()
    .WithIdentity("job", "group")
    .Build();
       //5、               
  await _scheduler.ScheduleJob(jobDetail, trigger);
  return await Task.FromResult(new string[] { "value1", "value2" });
 }
 }

public class MyJob : IJob//  IJob    ,   Excute  。
 {
 public Task Execute(IJobExecutionContext context)
 {
      return Task.Run(() =>
    {
    using (StreamWriter sw = new StreamWriter(@"C:\Users\Administrator\Desktop\error.log", true, Encoding.UTF8))
    {
     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));
    }
  });
 }
 }
출력 결과:
2018-08-03 00-03-19
2018-08-03 00-03-20
2018-08-03 00-03-22
2018-08-03 00-03-24
2018-08-03 00-03-26
위 에서 실 행 된 Job 에는 인자 가 없습니다.인자 가 필요 하면 다음 두 가지 방법 으로 인 자 를 전달 할 수 있 습 니 다.
1.Trigger 에 인자 값 추가

 var trigger3 = TriggerBuilder.Create()
   .WithSimpleSchedule(x =>x.WithIntervalInSeconds(2).RepeatForever())//  2      
   .UsingJobData("key1", 321) //   Trigger      
   .UsingJobData("key2", "123")
   .WithIdentity("trigger2", "group1")
   .Build();
2.Job 에 인자 값 추가

 IJobDetail job = JobBuilder.Create<MyJob>()
    .UsingJobData("key1", 123)//  Job     
    .UsingJobData("key2", "123")
    .WithIdentity("job1", "group1")
    .Build();
다음 방법 으로 Job 에서 매개 변수 값 가 져 오기

public class MyJob : IJob
 {
 public Task Execute(IJobExecutionContext context)
 {
  var jobData = context.JobDetail.JobDataMap;//  Job    

  var triggerData = context.Trigger.JobDataMap;//  Trigger    

  var data = context.MergedJobDataMap;//  Job Trigger      

  var value1= jobData.GetInt("key1");
  var value2= jobData.GetString("key2");

  var dateString = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");return Task.Run(() =>
  {
  using (StreamWriter sw = new StreamWriter(@"C:\Users\Administrator\Desktop\error.log", true, Encoding.UTF8))
  {
   sw.WriteLine(dateString);
  }
  });
 }
 }
Job 의 인자 가 Trigger 의 인자 이름과 같 을 때 context.MergedJobDataMap 으로 인 자 를 가 져 올 때 Trigger 의 값 은 Job 의 값 을 덮어 씁 니 다.
3.위의 상황 은 매개 변수 값 이 변 하지 않 는 상황 에 만 적응 할 수 있 습 니 다.
만약 이런 상황 이 있다 면 이번 매개 변수 값 은 지난번 에 실 행 된 후에 계 산 된 값 이 므 로 위의 방법 을 사용 할 수 없습니다.만약 에 2 초 마다 누적 작업 을 실현 한다 면 현재 초기 값 은 0 입 니 다.만약 에 위의 값 을 얻 는 작업 에 따라 0+1 이 고 반환 값 은 항상 1 입 니 다.이 상황 을 만족 시 키 기 위해 서 는 하나의 특성 만 추가 해 야 합 니 다.

[PersistJobDataAfterExecution]//  JobDetail JobDataMap     ,                          
 public class MyJob : IJob
 {
 public Task Execute(IJobExecutionContext context)
 {
  var jobData = context.JobDetail.JobDataMap;
  var triggerData = context.Trigger.JobDataMap;
  var data = context.MergedJobDataMap;

  var value1 = jobData.GetInt("key1");
  var value2 = jobData.GetString("key2");
  var value3 = data.GetString("key2");

  var dateString = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");
  Random random = new Random();

  jobData["key1"] = random.Next(1, 20);//    key  ,          ,         ,      
  jobData["key2"] = dateString;

  return Task.Run(() =>
  {
  using (StreamWriter sw = new StreamWriter(@"C:\Users\Administrator\Desktop\error.log", true, Encoding.UTF8))
  {
   sw.WriteLine($"{dateString} value1:{value1} value2:{value2}");
  }
  //context.Scheduler.DeleteJob(context.JobDetail.Key);
  //context.Scheduler.Shutdown();
  });
 }
 }
3.Quartz.Net 구성
Quartz 는 주로 세 부분 으로 작업(Job),트리거(Trigger),스케줄 러(Schedule)를 구성한다.
3.1 임무
Job 은 실 행 된 작업 입 니 다.Job 은 IJob 인 터 페 이 스 를 계승 하여 Execute 방법 을 실현 해 야 합 니 다.Job 에서 실 행 된 인 자 는 Execute 방법의 인자 에서 가 져 옵 니 다.
3.2 트리거
트리거 는 두 가지 가 있 습 니 다.Simple Trigger 트리거 와 CronTrigger 트리거 트리거 입 니 다.
Simple Trigger:간단 한 업 무 를 실현 할 수 있 습 니 다.예 를 들 어 몇 분 마다 실행 을 촉발 하고 실행 횟수 를 제한 할 수 있 습 니 다.

var trigger = TriggerBuilder.Create()
   .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).WithRepeatCount(5))//  2    6 
   .UsingJobData("key1", 321)
   .WithIdentity("trigger", "group")
   .Build();
CronTrigger:Cron 표현 식 은 7 개의 필드 를 포함 하고 초 분,월 내 날짜,월 내 날짜,년(선택 가능)을 포함 합 니 다.


예:

 var trigger = TriggerBuilder.Create()
   .WithCronSchedule("0 0 0 1 1 ?")//     1 1  0    
   .UsingJobData("key1", 321)
   .UsingJobData("key2", "trigger-key2")
   .WithIdentity("trigger4", "group14")
   .Build();
"0 15 10 * * ? *"         매일 오전 10:15 촉발 
"0 0-5 14 * * ?"          매일 오후 2 시 부터 오후 2 시 까지 1 분 마다 촉발 
3.3 스케줄 러
스케줄 러 는 트리거 가 실 행 될 때 작업 을 수행 하도록 작업 과 트리거 를 연결 하 는 것 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기