首页 > 代码库 > Spring 定时器结合线程池

Spring 定时器结合线程池

需求:Spring 定时器结合线程池处理工单

    a.定时扫库查出一定数量的需要处理的工单

    b.开启线程处理查出的工单

1,创建处理工单的task

@Component("AppWorkOrderTask")@Scope("prototype")public class AppWorkOrderTask implements Runnable {    public static final String BEAN_NAME = "AppWorkOrderTask";    @Resource    private IAppWorkOrderService appWorkOrderService;    private String appWorkOrderId;    public void execute() {      //处理工单逻辑代码    }    public String getAppWorkOrderId() {        return appWorkOrderId;    }    public void setAppWorkOrderId(String appWorkOrderId) {        this.appWorkOrderId = appWorkOrderId;    }    @Override    public void run() {        execute();    }}

 

2,创建扫库的定时器


public class AppWorkOrderScheduler extends TimerTask { private Logger logger = Logger.getLogger(AppWorkOrderScheduler.class); @Resource private IAppWorkOrderService appWorkOrderService; @Resource(name = "appWorkOrderTaskExecutor") private ThreadPoolTaskExecutor taskExecutor; @Override public void run() { //判断线程池容量 int size = taskExecutor.getMaxPoolSize() - taskExecutor.getActiveCount(); if (size > 0) {
        //找出工单 List
<String> appWorkOrderIds = appWorkOrderService.getAppWorkOrderList(20); logger.info("Find " + appWorkOrderIds.size() + " task(s) to execute..."); for (String appWorkOrderId : appWorkOrderIds) { AppWorkOrderTask task = newTask(appWorkOrderId); taskExecutor.execute(task); } } } private AppWorkOrderTask newTask(String appWorkOrderId) { AppWorkOrderTask task = (AppWorkOrderTask) BeanFactory.getInstance().getBeanByName(AppWorkOrderTask.BEAN_NAME);
      //从applicationContext 中获取 appWorkOrderTask 公共类就不再贴了 task.setAppWorkOrderId(appWorkOrderId);
return task; }}

3.配置文件

<?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:aop="http://www.springframework.org/schema/aop"    xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"    default-autowire="byName" default-lazy-init="true">    <!--应用工单异步线程执行器-->    <bean id="appWorkOrderTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">        <!-- 线程池维护线程的最少数量 -->        <property name="corePoolSize" value="10"/>        <!-- 线程池维护线程的最大数量 -->        <property name="maxPoolSize" value="20"/>        <!-- 线程池所使用的缓冲队列 -->        <property name="queueCapacity" value="20" />    </bean>        <bean class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">        <property name="scheduledTimerTasks">            <list>                <ref bean="appWorkOrderScheduledTimerTask" />            </list>        </property>    </bean>        <!-- Application WorkOrder Scheduler Timer -->    <bean id="appWorkOrderSchedulerTask" class="com.test.timer.scheduler.AppWorkOrderScheduler" />    <bean id="appWorkOrderScheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">         <!-- 运行过程中延时10000ms(10s) -->          <property name="delay" value="10000" />         <!--  每隔90s运行一次 -->          <property name="period" value="90000" />        <property name="timerTask" ref="appWorkOrderSchedulerTask" />    </bean></beans>

 

Spring 定时器结合线程池