Spring 定时器结合线程池

时间:2021-11-02 23:18:42

需求: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>