整合SpringMVC 和 Quartz 的两种方式

整合SpringMVC 和 Quartz 的两种方式

步骤前提:
搭建好开发环境,jar包。需要的jar包这里不一一诉说,这里只提供整合方式
1. 配置文件方式
 配置文件的写法:
可单独建xml文件,也可写入*Content.xml文件中,主要确保启动的时候读取这个配置文件就可以了。

    <bean name="startQuertz" lazy-init="false" autowire="no"  
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="myJobTrigger" />
            </list>
        </property>
    </bean>
   <!-- quartz-2.x的配置 -->
    <bean id="myJobTrigger"  
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="myJobDetail" />
        </property>
        <property name="cronExpression">
            <value>*/10 * * * * ?</value>
        </property>
    </bean>
    <!-- 秒 分 时 日 月 周 年(可选)。 0/5 * * * * ? -->
     <!-- 每隔5秒执行一次:*/5 * * * * ?
      每隔1分钟执行一次:0 */1 * * * ?
      每天23点执行一次:0 0 23 * * ?
      每天凌晨1点执行一次:0 0 1 * * ?
      每月1号凌晨1点执行一次:0 0 1 1 * ?
      每月最后一天23点执行一次:0 0 23 L * ?
      每周星期天凌晨1点实行一次:0 0 1 ? * L
      在26分、29分、33分执行一次:0 26,29,33 * * * ?
      每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
      每个整点执行 0 0 0-23 * * ? -->
    <!-- 调度的配置结束 -->

    <!-- job的配置开始 -->
    <bean id="myJobDetail"  
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="myJob" />
        </property>
        <property name="targetMethod">
            <value>work</value>
        </property>
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
        <property name="concurrent" >
            <value>false</value>
        </property>
    </bean>
    <!-- job的配置结束 -->

    <!-- 工作的bean -->
<bean id="myJob" class="com.sandyagor.time.quartz.MyJob" />

 需要执行的方法写法:
在com.sandyagor.time.quartz.MyJob 包下写一个work方法就行了
如:

private static final SimpleDateFormat DATEFORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//时间格式化
    private static int index = 0;
    public void work(){
        index++;
        int t = index;
        System.out.println("-----------------------------"+ t+" is running!"+DATEFORMATTER.format(new Date())+"-----------------------------");
        try {
            Thread.sleep(10*1000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("-----------------------------"+ t+" is over!"+DATEFORMATTER.format(new Date())+"-----------------------------");
    }

另外:也可以简化配置文件:
但需要添加引入,在注解中有说明
2. Spring注解
 添加需要的标签
xmlns 中添加:xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation 中添加:

http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.0.xsd

配置注解和计划任务:

<context:annotation-config />
    <!-- 扫描类包,将Spring注解的类自动转化Bean,同时完成Bean的注入 -->   
    <context:component-scan base-package="com. sandyagor.time"/>
    <!-- 注入方式执行定时任务 start-->
    <task:annotation-driven executor="myExecutor"   scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="5" />
<task:scheduler id="myScheduler" pool-size="10" />

如果不配置最后两行,控制台会有警告信息

如方式1的配置式启动,如果添加了标签可以使用简化的配置:

<!-- 定时器开关-->
    <task:annotation-driven />
    <!-- 管理的Bean -->
    <bean id="appJob" class="com.sandyagor.time.quartz.MyJob"/>
    <task:scheduled-tasks scheduler="task">
        <!--每三秒执行一次  -->
        <task:scheduled ref="appJob" method="work"
            cron="0/3 * * * * ?" />
    </task:scheduled-tasks>
    <task:scheduler id="task" pool-size="10" />

End 方式1简化配置
 下面说说注解的使用:
2.1 在需要运行的实现方法前加上spring的@Scheduled注解

@Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次

cron表达式前文有介绍,还需要更多的功能请自行查找
2.2 任务的并行和顺序执行
@Component 这个注解会顺序执行任务,即如果任务时间执行较长,下一个任务会等待直到前一个任务执行完毕再执行。
@EnableScheduling 则会并行执行两个线程
@Async 则支持配置式的线程池, 会执行到 task:scheduler 最大的线程数量,占满以后等待开始的线程结束
具体的注解方式,请参照api文档。以上说法有纰漏之处望谅解,作为个人学习笔记用,不喜勿喷。共同学习,共同提高。Rome was not built in a day
截图:运行截图
ps:本文中的spring 为3.X,quzrtz为当前最新的2.2.2
提供2.2.2的下载连接,但需要一个积分,当辛苦费了。
quzrtz2.2.2 带官方文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值