初次接觸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>
差不多就這樣了,如果我想不出更好的潤色點去寫這篇文章的話