【Java】定时任务Quartz

前言

Java小白一个,最近查看项目中关于定时器的源码,尝试自己配置了一下。文件参考


jar包

这是在定时器实现中使用到的jar包

  • c3p0-0.9.1.1.jar
  • jta.jar
  • log4j-1.2.16.jar
  • quartz-2.2.2.jar
  • quartz-jobs-2.2.2.jar
  • slf4j-api-1.7.7.jar
  • slf4j-log4j12-1.7.7.jar

环境

  • 1.7 JDK
  • spring框架

Web.xml

首先在Web.xml中配置属性

<servlet>
    <servlet-name>QuartzInitializer</servlet-name> 
        <display-name>Quartz Initializer Servlet</display-name>
    <servlet-class>
        org.quartz.ee.servlet.QuartzInitializerServlet
    </servlet-class> 

    <load-on-startup>1</load-on-startup>

    <init-param>
        <param-name>config-file</param-name>
        <param-value>/quartz.properties</param-value>
    </init-param>

    <init-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>start-scheduler-on-load</param-name>
        <param-value>true</param-value>
    </init-param> 
</servlet>  

制定quartz配置文件所在的路径


quartz.properties

在项目的src目录下配置quartz.properties文件,这里面是Quartz的配置

#===============================================================       
#Configure Main Scheduler Properties       
#===============================================================         
org.quartz.scheduler.instanceName = QuartzScheduler         
org.quartz.scheduler.instanceId = AUTO     

#===============================================================       
#Configure ThreadPool       
#===============================================================         
org.quartz.threadPool.threadCount = 20         
org.quartz.threadPool.threadPriority = 5        
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool       

#===============================================================       
#Configure JobStore       
#===============================================================         
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#===============================================================       
#Configure Plugins      
#===============================================================         
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin       
org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml       
org.quartz.plugin.jobInitializer.failOnFileNotFound = true  

在下载的quartz的jar包中包含它的原始配置问价,需要修改为我们自己需要的属性。这里加了plugins的配置,quartz_jobs.xml文件将配置需要执行的定时任务。


quartz_jobs.xml

在这里配置定时任务,需要制定定时任务执行的类、执行时间等信息。

<?xml version='1.0' encoding='utf-8'?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
  version="1.8">

    <schedule>
        <!-- 显示时间 -->
        <job>
            <name>ShowDateJob</name>
            <group>task</group>
            <job-class>com.swl.timer.ShowDate</job-class>
        </job>
        <trigger>
            <cron>
                <name>ShowDateCon</name>
                <group>task</group>
                <job-name>ShowDateJob</job-name>

                <job-group>task</job-group>
                <cron-expression>1 * * * * ?</cron-expression>
            </cron>
        </trigger>

    </schedule>

</job-scheduling-data>

要注意每个都与一个相关联,定义任务的名称、任务组、执行类,定义触发器触发的时间。如果需要配置多个定时任务,只需要在schedule中添加额外的与即可


执行类

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class ShowName implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        if(arg0 != null){
            System.out.println(arg0);
        }
        System.out.println("test task");
    }

}

每个执行类都是继承org.quartz.Job类,用户需要实现execute接口,这里面是需要执行的逻辑代码。这个接口有个参数arg0,当用户主动调用定时任务时,可以进行传参。


主动调用

@RequestMapping("/home/runjob.htm")
public void runjob(HttpServletRequest request, HttpServletResponse response) throws IOException, SchedulerException{
    ServletContext ctx = request.getSession().getServletContext();
    StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");
    Scheduler scheduler = factory.getScheduler();

    JobDetail jd = JobBuilder.newJob(ShowName.class).withIdentity("shownamejob_s","temporary_task_s")
            .storeDurably().build();
//  jd.getJobDataMap().put("params", params);

    Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("shownamejob", "temporary_task")//.withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
                .startNow()
                .build();
    scheduler.scheduleJob(jd,trigger);
}
  • 从Quartz1.5开始,QuartzInitializerServlet将自动储存StdSchedulerFactory实例在ServletContext里
  • JobDataMap可以储存定时任务的参数,这个值可以在execute的参数中获取
  • 多个任务时,任务名称不能相同,否则会报错

附加

本文只是将配置流程说明一下,具体配置内容请参考这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java Quartz是一个开源的作业调度框架,可以用来创建简单或复杂的定时任务。它支持各种不同的触发器类型,包括简单的时间间隔触发器、Cron表达式触发器、日历触发器和可编程触发器。Java Quartz还提供了一些特性来管理和监控作业调度,例如集群功能、持久化、作业执行历史记录、错误处理和作业调度统计信息等。 以下是一个简单的Java Quartz定时任务的示例代码: ```java import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务执行的代码 System.out.println("Hello, Quartz!"); } public static void main(String[] args) throws SchedulerException { // 创建一个定时任务调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 创建一个定时任务触发器 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) .repeatForever()) .build(); // 创建一个定时任务 JobDetail job = JobBuilder.newJob(QuartzJob.class) .withIdentity("job1", "group1") .build(); // 将定时任务和触发器绑定到调度器上 scheduler.scheduleJob(job, trigger); // 启动定时任务调度器 scheduler.start(); } } ``` 这个代码会创建一个定时任务,每隔5秒钟输出一次“Hello, Quartz!”。可以根据需要修改定时任务触发器的设置,例如修改触发器的时间间隔、起始时间、结束时间等。可以使用Java Quartz的其他功能来实现更复杂的定时任务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逛街的猫啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值