web应用程序中时常需要定时循环的执行一些状态更新,或者数据清理的相关任务,亦如超时订单的处理,spring中实现计划任务也是非常方便

Java代码

public class NetDayUpdateTask extends TimerTask {

    @Autowired
    AccountBiz accountBiz;

    private Long interval;

    public void setInterval(Long interval) {
        this.interval = interval;
    }

    private ThreadPoolTaskExecutor threadPool;

    public void setThreadPool(ThreadPoolTaskExecutor threadPool) {
        this.threadPool = threadPool;
    }

    @Override
    public void run() {
        threadPool.execute(new Runnable() {
            public void run() {
                accountBiz.updateAllNetDay(new BigDecimal("-1"), SystemStatus.NORMAR);
            }
        });
    }

}

Spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 异步线程池 -->
    <bean id="scheduleThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 核心线程数 -->
        <property name="corePoolSize" value="5" />
        <!-- 最大线程数 -->
        <property name="maxPoolSize" value="10" />
        <!-- 队列最大长度 >=mainExecutor.maxSize -->
        <property name="queueCapacity" value="50" />
        <!-- 线程池维护线程所允许的空闲时间 -->
        <property name="keepAliveSeconds" value="300" />
        <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>

    <bean id="netDayUpdateTask" class="cn.com.hohistar.wifia.service.schedule.NetDayUpdateTask">
        <property name="threadPool" ref="scheduleThreadPool" />
        <property name="interval">
            <value>${schedule.netDayUpdateTask.interval}</value>
        </property>
    </bean>

    <bean id="springScheduleExecutorTask" class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
        <property name="runnable" ref="netDayUpdateTask" />
        <!-- 容器加载10秒后开始执行 -->
        <property name="delay" value="10000" />
        <!-- 每次任务间隔 n毫秒 -->
        <property name="period">
            <value>${schedule.netDayUpdateTask.interval}</value>
        </property>
    </bean>

    <bean id="springScheduledExecutorFactoryBean" class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
        <property name="scheduledExecutorTasks">
            <list>
                <ref bean="springScheduleExecutorTask" />
            </list>
        </property>
    </bean>
</beans>

参考:http://supben.iteye.com/blog/813974

运行效果

QQ截图20151228133902

Spring MVC 全局异常处理

经典的 MVC 程序中,如果产生了一个非业务异常,或者非本业务可以处理的其他业务异常,那么我们一般会一直往上层抛(或者适当包装后继续抛出)直到控制层,控...

阅读全文

Spring MVC 字段校验组的使用

在Spring MVC中,我们可以在Java Bean的字段上标注一些校验器进行字段数据合法性校验,但有时候我们需要对这些校验器进行分组操作,本文将介绍分组的作用及使...

阅读全文

欢迎留言