spring4.3.x与quartz2.2.x集成 (2) 单机模式
1 quartz单机模式用不到数据库访问,项目结构如下
applicationcontext.xml 配置如下
<!-- 配置扫描的包 -->
<context:component-scan base-package="com.code.quartz.job" />
<context:component-scan base-package="com.code.quartz.method" />
<!-- 单机 -->
<import resource="classpath:quartz-alone.xml" />
2 quartz-alone.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">
<!-- 定时执行job -->
<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="cn.code.quartz.job.HelloJob" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="10000" />
</map>
</property>
</bean>
<!-- 第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job1" />
<!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<property name="startDelay" value="0" />
<!-- 每10秒调度一次 -->
<property name="repeatInterval" value="10000" />
</bean>
<!-- ============================================================================== -->
<!-- 定时执行类函数方法 -->
<bean id="websiteSearchEngine" class="cn.code.quartz.method.MethodJobDemo" />
<bean id="siteSearchJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="websiteSearchEngine" />
</property>
<property name="targetMethod">
<value>runWebsiteSearcher</value>
</property>
</bean>
<!-- 第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。 -->
<!--
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
-->
<bean id="siteSearchSimpleTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="siteSearchJobDetail" />
</property>
<!--每天23:15触发执行一次 -->
<!-- <property name="cronExpression" value="0 15 23 * * ?" /> -->
<!--每间隔10秒触发执行一次 -->
<property name="cronExpression" value="0/10 * * * * ?" />
</bean>
<!-- ============================================================================== -->
<!-- 配置调度工厂 -->
<bean id="siteSearchSfb"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="siteSearchSimpleTrigger" />
<ref bean="simpleTrigger" />
</list>
</property>
<!-- 定时任务自动开启 -->
<property name="autoStartup">
<value>true</value>
</property>
<!-- 从配置文件读取 -->
<!-- <property name="configLocation" value="classpath:quartz.properties" /> -->
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">DefaultQuartzScheduler</prop>
<prop key="org.quartz.scheduler.rmi.export">false</prop>
<prop key="org.quartz.scheduler.rmi.proxy">false</prop>
<prop key="org.quartz.scheduler.wrapJobExecutionInUserTransaction">false</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">1</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<prop
key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
</props>
</property>
</bean>
</beans>
3 触发器有2种方式
SimpleTrigger:当你需要的是一次性的调度(仅是安排单独的任务在指定的时间及时执行),或者你需要在指定的时间**某个任务并执行N次,设置每次任务执行的间隔时间T。那此时使用SimpleTrigger将是非常方便的。
SimpleTriggerFactoryBean:基于调度间隔时间
CronTrigger:如果你需要安排的任务时基于日期的-比如"每个星期五正午"或者"每个月10号的10:15",使用CronTrigger将是非常有用的。
CronTriggerFactoryBean:基于时间刻度(可以设置具体时间)
4 定义过程
1 定义要执行的Job类 (jobClass)
2 定义要调用的对象和对象的方法 (JobDetailFactoryBean,MethodInvokingJobDetailFactoryBean)
3 在触发器中配置使用该方法的时间 (SimpleTriggerFactoryBean,CronTriggerFactoryBean)
4 在总管类中添加该任务 (SchedulerFactoryBean)
5 SimpleTriggerFactoryBean 测试类如下
public class HelloJob implements Job{
public static final Logger logger = LoggerFactory.getLogger(App.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.info("hello word!!! - " + new Date());
}
}
6 CronTriggerFactoryBean测试类如下
@Component
public class MethodJobDemo {
public static final Logger logger = LoggerFactory.getLogger(App.class);
public void runWebsiteSearcher() {
logger.info("----------------runWebsiteSearcher---------------");
}
}
7 测试结果