.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 스케줄 러
스케줄 러 는 트리거 가 실 행 될 때 작업 을 수행 하도록 작업 과 트리거 를 연결 하 는 것 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.