之前看了程序员杂志上关于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>
分享到:
相关推荐
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...
本文详细介绍了如何在Spring3.2.6中配置线程池和定时任务,包括XML配置文件的具体设置以及程序类的实现。通过这种方式,可以有效地管理后台任务的执行,提高系统的并发处理能力。这种配置方式不仅适用于Spring3.2.6...
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
Spring框架提供了多种方式来实现定时任务,这使得开发者可以在不同场景下选择最适合的方案。本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 ...
Spring定时任务的几种实现,欢迎交流!
本项目就是基于Spring MVC、Mybatis、Quartz和Swagger实现的一个定时任务管理系统,旨在提供一种灵活且可配置的方式来管理和控制定时任务。下面将详细讲解这个系统的核心组成部分及其工作原理。 首先,Spring MVC是...
在Spring框架中,定时任务是通过Spring的Task模块来实现的,这使得在非Web项目中也能方便地进行定时任务的调度。以下是对这个主题的详细讲解。 首先,我们需要了解Spring Task的核心组件: 1. **...
`spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...
在Spring框架中,定时任务是实现系统自动化运行关键任务的重要工具。Spring提供了多种方式来创建和管理定时任务,包括基于接口的TaskExecutor、基于注解的@Scheduled和集成Quartz Scheduler。下面将详细讲解这三种...
**Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态创建和修改定时任务。首先,我们需要在Spring配置文件中声明一个SchedulerFactoryBean,然后定义JobDetail和Trigger,分别表示...
标题 "spring2.0学习笔记+spring定时任务" 暗示了我们即将探讨的是关于Spring框架2.0版本的学习心得以及如何在Spring中配置和使用定时任务。在这个主题下,我们将深入理解Spring的核心概念,特别是它在企业级Java...
在Spring中,我们可以使用Spring的TaskExecution和TaskScheduling模块来实现定时任务,这些功能通常依赖于特定的jar包。以下是对标题和描述中涉及的知识点的详细解释: 1. **Spring Task模块**:这是Spring提供的一...
本项目旨在演示如何利用Spring和Quartz从数据库中动态加载定时任务,并实现对它们的增删改查功能。以下是关于这个主题的详细知识讲解。 首先,Quartz是一个开源的作业调度框架,它允许开发者创建、安排和执行定时...
本案例中的“定时任务+案例”显然关注的是如何利用编程语言(可能是Java,因为Java中常使用Calendar类进行日期和时间操作)来实现一个定时启动的任务线程。下面将详细解释这个过程。 1. **定时任务基础概念**:定时...
Spring提供`@Async`注解来支持异步任务执行,可以将定时任务与主线程分离,避免阻塞。同时,通过`@Scheduled`注解的`concurrent`属性,可以控制多个实例是否并发执行。 8. **监听任务状态** Spring还提供了`...
基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于...
使用环境:MyEclipse/Eclipse + Tomcat + MySQL。...使用技术:Spring MVC + Spring + MyBatis 或 JSP + Servlet + JavaBean + JDBC。 演示地址:https://ymjin.blog.csdn.net/article/details/120991940
7. **任务调度**:使用Quartz或Spring Task进行定时任务,如自动提醒借阅到期的用户。 8. **邮件服务**:集成SMTP发送邮件通知,如注册验证、借阅提醒等。 9. **报表生成**:如使用JasperReports或iText生成统计报告...
Spring框架提供了强大的定时任务支持,使得在Web项目中实现这类功能变得简单易行。本案例将详细介绍如何利用Spring技术来实现定时任务,并提供相关的代码示例。 一、Spring定时任务简介 Spring框架的定时任务功能...
在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在特定的时间间隔执行一些重复性的任务。本文将深入探讨Spring中的定时任务,并结合Eclipse和Maven项目环境进行讲解。 首先,Spring提供了两...