spring4.3.x与quartz2.2.x集成 (2) 单机模式

1 quartz单机模式用不到数据库访问,项目结构如下
spring4.3.x与quartz2.2.x集成 (2) 单机模式
 
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  测试结果
 spring4.3.x与quartz2.2.x集成 (2) 单机模式