`
锅巴49
  • 浏览: 163998 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring定时任务+线池程实现

阅读更多

之前看了程序员杂志上关于spring 定时任务实现异步任务的文章,自己架了一套帮助实现一些费时的操作。

在实现中发现几个问题

 

1、定时任务中时间设置是这样的

<property name="delay" value="1000" />
<!-- 每次任务间隔 5秒-->
<property name="period" value="5000" />

 

在某些配置下某任务开始后还没执行完过了5秒,第二个任务又起来了。

这与我的设计冲突。我希望任务是执行完后等5秒再进行第二个任务。

最后发现这个类可以

<bean id="springScheduleExecutorTask"
	class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
		<!-- 配置主任务 -->
		<property name="runnable" ref="mainExecutor" />
		<!-- 程序启动后延迟1秒执行第一次任务 -->
		<property name="delay" value="1000" />
		<!-- 每次任务间隔 5秒-->
		<property name="period" value="5000" />
</bean>

 

2、在主任务中我把小任务分放给线程池操作,必须要等线程池完成工作后才能结束主任务run

    如果起动线程池主任务run完毕,第二个任务5秒之后就运行了。我实现的代码是

//等待线程执行完毕
        while(threadPool.getActiveCount() > 0){
            try{
                Thread.sleep(1000);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

   其实也可以采用观察者模式让线程池中任务发消息给主任务,主任务等待,

这个我之前有发给文章。 http://guoba6688-sina-com.iteye.com/blog/719972

 

附上所有代码

 

 

package com.my.task;

import java.util.TimerTask;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
 * 
 * 主任务起动
 *
 * @author 锅巴
 * @version 1.0 2010-7-29
 */
public class MainExecutor extends TimerTask {

    private ThreadPoolTaskExecutor threadPool;
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("MainExecutor is start");
        try{
            Thread.sleep(5000);
        }catch(Exception e){
            e.printStackTrace();
        }
        threadPool.execute(new MyTask(10));
        threadPool.execute(new MyTask(10));
        threadPool.execute(new MyTask(10));
        
        //等待线程执行完毕
        while(threadPool.getActiveCount() > 0){
            try{
                Thread.sleep(1000);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
        System.out.println("MainExecutor is end");
        
    }

    public ThreadPoolTaskExecutor getThreadPool() {
        return threadPool;
    }

    public void setThreadPool(ThreadPoolTaskExecutor threadPool) {
        this.threadPool = threadPool;
    }

    public static void main(String[] args) {
        new ClassPathXmlApplicationContext(new String[]{"task.context.xml"});
    }
    
}

 

 

 

package com.my.task;

public class MyTask implements Runnable{

    private int count;
    
    public MyTask(int count){
        this.count = count;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
    
        for(int i=0; i<count; i++){
            System.out.println(Thread.currentThread().getName() + " : " + i); 
        }
        System.out.println(Thread.currentThread().getName() + " end ");
        
    }

}

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd">
<beans default-autowire="byName">


   
	<bean id="springScheduledExecutorFactoryBean"
		class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
		<property name="scheduledExecutorTasks">
			<list>
				<ref bean="springScheduleExecutorTask" />
			</list>
		</property>
	</bean>

	
	<bean id="springScheduleExecutorTask"
		class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
		
		<property name="runnable" ref="mainExecutor" />
		
		<property name="delay" value="1000" />
		<!-- 每次任务间隔 5秒-->
		<property name="period" value="5000" />
	</bean>

	<!-- 主任务 负责扫描任务 将任务分配给线程完成 -->
	<bean id="mainExecutor"
		class="com.my.task.MainExecutor">
		<property name="threadPool" ref="threadPool" />
	</bean>

	<!-- 异步线程池 -->
	<bean id="threadPool"
		class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
		<!-- 核心线程数  -->
		<property name="corePoolSize" value="10" />
		<!-- 最大线程数 -->
		<property name="maxPoolSize" value="50" />
		<!-- 队列最大长度 >=mainExecutor.maxSize -->
		<property name="queueCapacity" value="1000" />
		<!-- 线程池维护线程所允许的空闲时间 -->
		<property name="keepAliveSeconds" value="300" />
		<!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
		<property name="rejectedExecutionHandler">
			<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
		</property>
	</bean>

</beans>

 

4
0
分享到:
评论
1 楼 supben 2010-11-17  
ScheduledExecutorTask
能配置任务开始的固定时分秒么。
类似quartz那种。

相关推荐

    spring+springMVC+mybatis+quartz动态定时任务创建

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...

    Spring3.2.6定时任务+线程池.docx

    本文详细介绍了如何在Spring3.2.6中配置线程池和定时任务,包括XML配置文件的具体设置以及程序类的实现。通过这种方式,可以有效地管理后台任务的执行,提高系统的并发处理能力。这种配置方式不仅适用于Spring3.2.6...

    SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证

    SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...

    spring定时任务实现

    Spring框架提供了多种方式来实现定时任务,这使得开发者可以在不同场景下选择最适合的方案。本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 ...

    Spring定时任务管理

    Spring定时任务的几种实现,欢迎交流!

    Spring mvc + Mybatis + quartz + swagger 定时任务管理[新增、编辑、删除、修改]

    本项目就是基于Spring MVC、Mybatis、Quartz和Swagger实现的一个定时任务管理系统,旨在提供一种灵活且可配置的方式来管理和控制定时任务。下面将详细讲解这个系统的核心组成部分及其工作原理。 首先,Spring MVC是...

    Spring定时任务实现(非Web项目)

    在Spring框架中,定时任务是通过Spring的Task模块来实现的,这使得在非Web项目中也能方便地进行定时任务的调度。以下是对这个主题的详细讲解。 首先,我们需要了解Spring Task的核心组件: 1. **...

    spring定时任务关键jar包(齐全)

    `spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    在Spring框架中,定时任务是实现系统自动化运行关键任务的重要工具。Spring提供了多种方式来创建和管理定时任务,包括基于接口的TaskExecutor、基于注解的@Scheduled和集成Quartz Scheduler。下面将详细讲解这三种...

    spring+quartz动态定时任务创建 +mybatis

    **Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态创建和修改定时任务。首先,我们需要在Spring配置文件中声明一个SchedulerFactoryBean,然后定义JobDetail和Trigger,分别表示...

    spring2.0学习笔记+spring定时任务

    标题 "spring2.0学习笔记+spring定时任务" 暗示了我们即将探讨的是关于Spring框架2.0版本的学习心得以及如何在Spring中配置和使用定时任务。在这个主题下,我们将深入理解Spring的核心概念,特别是它在企业级Java...

    spring定时任务依赖的jar包

    在Spring中,我们可以使用Spring的TaskExecution和TaskScheduling模块来实现定时任务,这些功能通常依赖于特定的jar包。以下是对标题和描述中涉及的知识点的详细解释: 1. **Spring Task模块**:这是Spring提供的一...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    本项目旨在演示如何利用Spring和Quartz从数据库中动态加载定时任务,并实现对它们的增删改查功能。以下是关于这个主题的详细知识讲解。 首先,Quartz是一个开源的作业调度框架,它允许开发者创建、安排和执行定时...

    定时任务+案例

    本案例中的“定时任务+案例”显然关注的是如何利用编程语言(可能是Java,因为Java中常使用Calendar类进行日期和时间操作)来实现一个定时启动的任务线程。下面将详细解释这个过程。 1. **定时任务基础概念**:定时...

    Spring定时任务

    Spring提供`@Async`注解来支持异步任务执行,可以将定时任务与主线程分离,避免阻塞。同时,通过`@Scheduled`注解的`concurrent`属性,可以控制多个实例是否并发执行。 8. **监听任务状态** Spring还提供了`...

    基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server)

    基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于...

    基于Spring MVC + Spring + MyBatis的【图书信息管理系统(一)】.zip

    使用环境:MyEclipse/Eclipse + Tomcat + MySQL。...使用技术:Spring MVC + Spring + MyBatis 或 JSP + Servlet + JavaBean + JDBC。 演示地址:https://ymjin.blog.csdn.net/article/details/120991940

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    7. **任务调度**:使用Quartz或Spring Task进行定时任务,如自动提醒借阅到期的用户。 8. **邮件服务**:集成SMTP发送邮件通知,如注册验证、借阅提醒等。 9. **报表生成**:如使用JasperReports或iText生成统计报告...

    Spring定时任务(Web项目)

    Spring框架提供了强大的定时任务支持,使得在Web项目中实现这类功能变得简单易行。本案例将详细介绍如何利用Spring技术来实现定时任务,并提供相关的代码示例。 一、Spring定时任务简介 Spring框架的定时任务功能...

    Spring中定时任务

    在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在特定的时间间隔执行一些重复性的任务。本文将深入探讨Spring中的定时任务,并结合Eclipse和Maven项目环境进行讲解。 首先,Spring提供了两...

Global site tag (gtag.js) - Google Analytics