web环境下quartz配置实例

在web环境下,Quartz可以通过配置文件来完成后台的作业调度,不必手工创建Trigger和Scheduler,其步骤如下:

首先将quartz.jar,以及lib目录下面core和optional两个目录中的所有jar全都放入项目WEB-INF\lib目录下

job就是一个简单的java类,这里的功能就是输出当前的时间了。


 
  1. import java.util.Date;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5. import org.quartz.Job;  
  6. import org.quartz.JobExecutionContext;  
  7. import org.quartz.JobExecutionException;  
  8.   
  9. public class Helloworld implements Job{  
  10.  public Helloworld() {  
  11.  }  
  12.   
  13.  private static Log _log = LogFactory  
  14.    .getLog(Helloworld.class);  
  15.   
  16.  public void execute(JobExecutionContext context)  
  17.    throws JobExecutionException {  
  18.   _log.info("Hello World! - " + new Date());  
  19.  }  
  20. }  

然后编写quartz.properties文件,这个文件的默认名称就是quartz.properties,如果启动项目的时候,Quartz没有在工程中找到该文件,就会从自己的jar包下面读取其默认的properties文件,其内容如下:

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =  2
org.quartz.threadPool.threadPriority = 4

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

上面的

org.quartz.plugin.jobInitializer.fileName = quartz_job.xml

是用来配置定义job文件的名称。

然后编写quartz_job.xml,

<quartz><job> <trigger> </trigger> </job>


 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>  
  3.   <job>  
  4.     <job-detail>  
  5.       <name>helloworld</name>  
  6.       <group>group1</group>  
  7.       <job-class>Helloworld</job-class>  
  8.     </job-detail>  
  9.     <trigger>  
  10.       <cron>  
  11.         <name>test</name>  
  12.         <group>group1</group>  
  13.         <job-name>helloworld</job-name>  
  14.         <job-group>group1</job-group>  
  15.         <cron-expression>0 0/1 * * * ?</cron-expression>  
  16.      </cron>  
  17.     </trigger>  
  18.   </job>  
  19. </quartz>  

</quartz>

可以看到,在配置文件中把jobdetail和trigger都作了完整的定义,并组合成一个job。下面,我们把上面两个文件都放入/WEB-INF/classes目录下,然后按照api中的说明修改一下web.xml。


 
  1. <servlet>  
  2.          <servlet-name>  
  3.              QuartzInitializer  
  4.          </servlet-name>  
  5.          <display-name>  
  6.              Quartz Initializer Servlet  
  7.          </display-name>  
  8.          <servlet-class>  
  9.              org.quartz.ee.servlet.QuartzInitializerServlet  
  10.          </servlet-class>  
  11.          <load-on-startup>1</load-on-startup>  
  12.          <init-param>  
  13.              <param-name>config-file</param-name>  
  14.              <param-value>/quartz.properties</param-value>  
  15.          </init-param>  
  16.          <init-param>  
  17.              <param-name>shutdown-on-unload</param-name>  
  18.              <param-value>true</param-value>  
  19.          </init-param>  
  20. </servlet>  

这样,在启动Tomcat的时候,QuartzInitializerServlet这个Servlet就会自动读取quartz.properties这个配置文件,并初始化调度信息,启动Scheduler。
我在这里用的是Quartz1.5.0,在1.5.1中新增加了QuartzInitializerListener,但是似乎有些问题,始终启动不起来,而且更过分的是,它的api居然写错了,在 <listener-class>这个标记中,用了 QuartzInitializerServletListener,就算把机器砸了,它也找不到这个类啊!</listener-class>

现在就大功告成了

Quartz是一个流行的开源任务调度框架,可以帮助我们在.NET Core Web Api中进行任务调度。下面是配置Quartz的步骤: 1. 安装Quartz NuGet包:在Visual Studio中打开NuGet包管理器控制台,运行以下命令安装Quartz NuGet包: ``` Install-Package Quartz ``` 2. 创建Job类:创建一个继承自IJob接口的Job类,实现Execute方法。在这个方法中,你可以编写你的任务逻辑。 ``` public class MyJob : IJob { public async Task Execute(IJobExecutionContext context) { // 编写任务逻辑 } } ``` 3. 配置Scheduler:在Startup.cs文件中,添加以下代码来配置Scheduler: ``` services.AddSingleton<IJobFactory, QuartzJobFactory>(); services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>(); services.AddSingleton(new JobSchedule( jobType: typeof(MyJob), cronExpression: "0 0/5 * * * ?")); // 每5分钟执行一次任务 services.AddHostedService<QuartzHostedService>(); ``` 4. 创建JobSchedule类:创建一个JobSchedule类,用于存储Job的类型和Cron表达式。 ``` public class JobSchedule { public JobSchedule(Type jobType, string cronExpression) { JobType = jobType; CronExpression = cronExpression; } public Type JobType { get; } public string CronExpression { get; } } ``` 5. 创建QuartzJobFactory类:创建一个实现IJobFactory接口的QuartzJobFactory类,用于创建Job实例。 ``` public class QuartzJobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public QuartzJobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { return (IJob)_serviceProvider.GetService(bundle.JobDetail.JobType); } public void ReturnJob(IJob job) { // do nothing } } ``` 6. 创建QuartzHostedService类:创建一个QuartzHostedService类,实现IHostedService接口,并在StartAsync方法中启动Scheduler。 ``` public class QuartzHostedService : IHostedService { private readonly ISchedulerFactory _schedulerFactory; private readonly IJobFactory _jobFactory; private readonly IEnumerable<JobSchedule> _jobSchedules; public QuartzHostedService( ISchedulerFactory schedulerFactory, IJobFactory jobFactory, IEnumerable<JobSchedule> jobSchedules) { _schedulerFactory = schedulerFactory; _jobFactory = jobFactory; _jobSchedules = jobSchedules; } public IScheduler Scheduler { get; set; } public async Task StartAsync(CancellationToken cancellationToken) { Scheduler = await _schedulerFactory.GetScheduler(cancellationToken); Scheduler.JobFactory = _jobFactory; foreach (var jobSchedule in _jobSchedules) { var job = JobBuilder.Create(jobSchedule.JobType) .WithIdentity(jobSchedule.JobType.FullName) .Build(); var trigger = TriggerBuilder.Create() .WithIdentity($"{jobSchedule.JobType.FullName}.trigger") .WithCronSchedule(jobSchedule.CronExpression) .Build(); await Scheduler.ScheduleJob(job, trigger, cancellationToken); } await Scheduler.Start(cancellationToken); } public async Task StopAsync(CancellationToken cancellationToken) { await Scheduler?.Shutdown(cancellationToken); } } ``` 现在,你已经成功地配置Quartz,可以在MyJob类中编写你的任务逻辑了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值