初次接触quartz时,确实出现了很多问题,所以为了以后方便查找使用,就把它记录下来
首先我使用的是quartz2.2.1.jar
<!--quartz定时器--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency>
框架我用的是ssm,quartz整合ssm的配置
spring-quartz.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 工作的bean(自己项目中的自定义类) --> <bean id="myJob" class="com.pskj.JXGSLZ.utils.QuartzTest" /> <!-- job的配置开始 --> <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="myJob" /> </property> <property name="targetMethod"> <value>start</value><!--要执行的方法--> </property> <!-- 上一次未执行完成的任务,要等待执行完再执行。 --> <property name="concurrent" value="false"></property> </bean> <!-- job的配置结束 --> <!-- 调度的配置开始 --> <bean id="crontestJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="myJobDetail" /> </property> <property name="cronExpression"> <!-- <value>* */5 * * * ?</value> 每天隔五分钟执行一次 --> <value>0/1 * * * * ?</value> <!--隔一秒执行一次--> </property> </bean> <!-- 调度的配置结束 --> <!-- 配置项目启动后任务就执行一次 --> <bean id="rsh_simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> <property name="startDelay" value="500" /> <property name="repeatInterval" value="0" /> <property name="repeatCount" value="0" /> </bean> <!-- 启动触发器的配置开始 --> <bean id="myTimer" name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="rsh_simpleTrigger1" /> <ref bean="crontestJobTrigger"/> </list> </property> <!-- <property name="waitForJobsToCompleteOnShutdown" value="true" /> --> </bean> <!-- 启动触发器的配置结束 --> </beans>
quartz要执行的方法,TestService也是我写的测试的service方法
QuartzTest
package com.pskj.JXGSLZ.utils; import com.pskj.JXGSLZ.service.test.TestService; import javax.annotation.Resource; public class QuartzTest { //测试表接口 @Resource(name="TestService") private TestService testService; public void start(){ System.out.println("执行定时任务");
Map map=new HashMap(); map.put("id","2"); try { //根据id查询该条数据(测试数据) Map list= testService.findById(map); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } } }
web.xml加载的文件(仅展示部分)
web.xml
<!-- 配置DispatcherServlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springMVC需要加载的配置文件--> <init-param> <param-name>contextConfigLocation</param-name>
<!--这里已经加载了quartz的配置文件--> <param-value>classpath:spring/spring-*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
mybatis.xml也引入了quartz的数据源(仅展示部分)
spring-mybatis.xml
<!-- 引入配置文件 数据库--> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value><!--jdbc数据源--> <value>classpath:quartz.properties</value><!--quartz数据源--> </list> </property> </bean>
因为quartz默认线程为10个,但我并不想要开这么多线程,所以想自己设置
quartz.properties
#线程池的名称 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool #线程数量 org.quartz.threadPool.threadCount=1 #线程优先级 org.quartz.threadPool.threadPriority=5 #自创建父线程 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true #超时时间(单位毫秒) org.quartz.jobStore.misfireThreshold=60000 #配置属性调度器 org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
以上就是quartz的基本使用配置,接下来看看运行(只是截了部分)
当然在配置的过程中可能发生一些问题,我遇到过配置quartz时job org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
报红找不到,最后引进了一个jar包才好的
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.11.RELEASE</version> </dependency>
差不多就这样了,如果我想不出更好的润色点去写这篇文章的话