使用的是quartz2.2.1.jar
pom.xml文件导入依赖包
<!--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>
以上是转载自 马革皮
以下是我的想法:
QuartzTest 文件可以写在serviceImpl文件下
package com.pskj.JXGSLZ.serviceImpl;
import com.pskj.JXGSLZ.service.test.TestService;
import javax.annotation.Resource;
//这里用注解定义
@Service("QuartzTest")
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();
}
}
}
<?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">
<!-- 因为我上面已经用注解定义了QuartzTest,这步就可以省略 -->
<!-- 工作的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="QuartzTest" /> <!-- 这里就可以直接注入了 -->
</property>
<property name="targetMethod">
<value>start</value><!--要执行的方法-->
</property>
<!-- 上一次未执行完成的任务,要等待执行完再执行。 -->
<property name="concurrent" value="false"></property>
</bean>
<!-- job的配置结束 -->
以下配置不变
...........
</beans>