Spring326定时任务+线程池

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Spring3.2.6框架多线程序配置【定时任务+线程池】费劲周折终于把这个功能配置起来了,在网上找到很多资料,大多数例子基本都是相互拷贝,前后不搭调,搞得不知所措。因此我把这次配置可以完整运行的示例程序整理出来,分享,希望有时间再进一步优化,共同进步。。Spring配置文件:?xmlversion=1.0encoding=UTF-8?!DOCTYPEbeansPUBLIC-//SPRING//DTDBEAN//EN!--线程池--beanid=taskExecutorclass=org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor!--核心线程数--propertyname=corePoolSizevalue=4/!--最大线程数--propertyname=maxPoolSizevalue=8/!--队列最大长度--propertyname=queueCapacityvalue=200/!--线程池维护线程所允许的空闲时间--propertyname=keepAliveSecondsvalue=300/!--线程池对拒绝任务(无线程可用)的处理策略--propertyname=rejectedExecutionHandlerbeanclass=java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy//property/beanbeanid=mainProcessclass=com.tz.controller.MainPropropertyname=taskExecutorref=taskExecutor//beanbeanid=springScheduleExecutorTaskclass=org.springframework.scheduling.concurrent.ScheduledExecutorTask!--要启动的主线程--propertyname=runnableref=mainProcess/!--容器加载运行延迟1秒--propertyname=delayvalue=1000/!--任务间隔时间(sleep时间)执行完第一组任务,执行第二组任务相隔时间,两个任务在时间上不应该相交--propertyname=periodvalue=10000//beanbeanid=springScheduledExecutorFactoryBeanclass=org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBeanpropertyname=scheduledExecutorTaskslistrefbean=springScheduleExecutorTask//list/property/bean/beans程序对应的类:MainPro.javapackagecom.tz.controller;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;/***要起动的主线程*@authorwyg@20151013*/publicclassMainProimplementsRunnable{privateThreadPoolTaskExecutortaskExecutor;publicMainPro(){}publicMainPro(ThreadPoolTaskExecutortaskExecutor){this.taskExecutor=taskExecutor;}publicThreadPoolTaskExecutorgetTaskExecutor(){returntaskExecutor;}publicvoidsetTaskExecutor(ThreadPoolTaskExecutortaskExecutor){this.taskExecutor=taskExecutor;}publicvoidrun(){for(inti=0;i25;i++){taskExecutor.execute(newMessagePrinterTask(Message=+i));}//等待池中线程执行完while(taskExecutor.getActiveCount()0){try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(主线程分配完毕);}/***这个子线程来就是我们系统要处理的任务*@authorwyg@20151013*/privateclassMessagePrinterTaskimplementsRunnable{privateStringmessage;publicMessagePrinterTask(Stringmessage){this.message=message;}publicvoidrun(){System.out.println(message);}}}补充知识:1、解析springschedule来源:在schedule这块支持JDKTimer、concurrent、quartz三种,这三种任务调度方案在实现机制和调用方法上都不同,但spring通过对其包装,使得基于spring能用统一的配置和编码风格来使用这三种schedule方案。总得来说这三种schedule都是基于scheduler-trigger-job的基本流程,因此spring通过TimerFactoryBean、ScheduledExecutorFactoryBean和SchedulerFactoryBean分别实现JDKTimer、concurrent和quartz的基本流程。主要逻辑如下代码所示:TimerFactoryBean[java]viewplaincopy1.publicvoidafterPropertiesSet(){2.logger.info(InitializingTimer);3.this.timer=createTimer(this.beanName,this.daemon);4.//RegisterspecifiedScheduledTimerTasks,ifnecessary.5.if(!ObjectUtils.isEmpty(this.scheduledTimerTasks)){6.//注册task和timerregisterTasks(this.scheduledTimerTasks,this.timer);7.}8.}ScheduledExecutorFactoryBean[c-sharp]viewplaincopy1.publicvoidafterPropertiesSet(){2.if(logger.isInfoEnabled()){3.logger.info(InitializingScheduledExecutorService+4.(this.beanName!=null?'+this.beanName+':));5.}6.ScheduledExecutorServiceexecutor=7.createExecutor(this.poolSize,this.threadFactory,this.rejectedExecutionHandler);8.//RegisterspecifiedScheduledExecutorTasks,ifnecessary.9.if(!ObjectUtils.isEmpty(this.scheduledExecutorTasks)){10.registerTasks(this.scheduledExecutorTasks,executor);11.}12.//Wrapexecutorwithanunconfigurabledecorator.13.this.executor=(this.exposeUnconfigurableExecutor?14.Executors.unconfigurableScheduledExecutorService(executor):executor);15.}SchedulerFactoryBean[c-sharp]viewplaincopy1.publicvoidafterPropertiesSet()throwsException{2......3.//初始化sceduler4.initSchedulerFactory(schedulerFactory);5.this.scheduler=createScheduler(schedulerFactory,this.schedulerName);6.//注册listener、trigger和job7.registerListeners();8.registerJobsAndTriggers();9.......10.//启动scheduler11.startScheduler(this.scheduler,this.startupDelay);12.......13.}14.}顺着scheduler-trigger-job的思路,Spring又分别对JDKTimer、concurrent、quartz的trigger进行了封装,暴露出时间调度的配置参数,三种封装类分别为ScheduledTimerTask、ScheduledExecutorTask和CronTriggerBean+SimpleTriggerBean。三种trigger封装类分别根据实现机制的特点暴露出时间调度配置并串联起scheduler和具体job任务

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功