• 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>
  • 相关阅读:
    C++中的extern "C"【转】
    无题
    MATLAB中文件的读写和数据的导入导出【转】
    逝去的2012
    C/C++语言中Static的作用详述
    C++:源文件与头文件有什么区别【转】
    Bash,后台与nohup
    关于include 和 extern
    python易错点
    android实现点击两次返回键实现退出功能
  • 原文地址:https://www.cnblogs.com/china2k/p/4049897.html
Copyright © 2020-2023  润新知