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>
时间: 2024-10-12 08:54:26

Spring 定时器结合线程池的相关文章

spring提供的线程池

SPRING中的线程池ThreadPoolTaskExecutor 分类: JAVA Spring2013-07-12 10:36 14896人阅读 评论(9) 收藏 举报 Spring线程池多线程 一.初始化 1,直接调用 [java] view plaincopyprint? ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); //线程池所使用的缓冲队列 poolTaskExecutor.setQue

Spring中的线程池ThreadPoolTaskExecutor

1.直接调用Spring框架中的ThreadPoolTaskExecutor ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); //线程池所使用的缓冲队列 poolTaskExecutor.setQueueCapacity(200); //线程池维护线程的最少数量 poolTaskExecutor.setCorePoolSize(5); //线程池维护线程的最大数量 poolTaskExecutor.s

Python的定时器与线程池

定时器执行循环任务: 知识储备 Timer(interval, function, args=None, kwargs=None) interval ===> 时间间隔 单位为s function ===> 定制执行的函数 使用threading的 Timer 类 start() 为通用的开始执行方法 cancel ()为取消执行的方法 普通单次定时执行 from threading import Timer import time # 普通单次定时器 def handle(): print(

Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

简介 Spring包含了对定时调度服务的内置支持类.当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler(http://www.opensymphony.com/quartz/).二者都可以通过FactoryBean,分别指向Timer或Trigger实例的引用进行配置.更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingFactoryBean操作).Spring

【转】Spring线程及线程池的使用

最近公司项目正逐渐从dubbo向springCloud转型,在本次新开发的需求中,全部使用springcloud进行,在使用时线程池,考虑使用spring封装的线程池,现将本次使用心得及内容记录下来 一.线程池常规使用方式 之前使用线程池的方式,都是自己定义线程池,然后写多线程类,用线程池去调用,如下: package cn.leadeon.message.client; import cn.leadeon.comm.log.Log; import cn.leadeon.message.req.

多线程篇六:线程池

1.固定大小的线程池 ExecutorService threadPools1=Executors.newFixedThreadPool(3); for(int i=1;i<=10;i++){ final int task=i; //循环10次,一共往线程池里面放10个任务 threadPools1.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().ge

.NET线程池

摘要 深度探索 Microsoft .NET提供的线程池, 揭示什么情况下你需要用线程池以及 .NET框架下的线程池是如何实现的,并告诉你如何去使用线程池. 内容 介绍 .NET中的线程池 线程池中执行的函数 使用定时器 同步对象的执行 异步I/O操作 监视线程池 死锁 有关安全性 结束 介绍 如 果你有在任何编程语言下的多线程编程经验的话,你肯定已经非常熟悉一些典型的范例.通常,多线程编程与基于用户界面的应用联系在一起,它们需要在不影响终 端用户的情况下,执行一些耗时的操作.取出任何一本参考书

java线程池的学习

package advancedJava;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit; * java 线程池学习 * @author: cuiH * Date: 13-12-7public class ThreadPoolTest { * 线程池的概念 * jdk5提出了ThreadPool的概念 * 之

java线程池技术

1.线程池的实现原理?简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能. 线程池技术正是关注如何缩短或调整T1.T3时间的技术,从而提高服务器程序性能的.它把T1.T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理