`
liuxi1024
  • 浏览: 390128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

年底总结2-spring多线程任务调度

 
阅读更多

 1、spring framework开发参考手册中第23掌"spring中的定时调度(Scheduling)和线程池(Thread Pooling)"提到三种方式:

(1)使用OpenSymphony Quartz 调度器

(2)使用JDK Timer支持类

(3)SpringTaskExecutor抽象

 

2、实际业务需求说明

(1)同时向50台设备采集数据,并保存本地数据库。

(2)每30秒钟执行一次调度,完成对这50台设备数据的读取。

 

3、根据实际业务分析,属于多线程并发处理任务,于是采用SpringTaskExecutor抽象方式完成

 

4、spring 容器配置

 

<!-- 接收数据 -->
    <!-- 异步线程池 -->
    <bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <!-- 核心线程数  -->
    <property name="corePoolSize" value="10" />
    <!-- 最大线程数 -->
    <property name="maxPoolSize" value="100" />
    <!-- 队列最大长度 >=mainExecutor.maxSize -->
    <property name="queueCapacity" value="1000" />
    <!-- 线程池维护线程所允许的空闲时间 -->
    <property name="keepAliveSeconds" value="300" />
    <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
    <property name="rejectedExecutionHandler">
    	<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
    </property>
    </bean>
    
    <bean id="collectSalesOrderExecutor" class="com.fts.internal.CollectSalesOrderExecutor">
    	<property name="threadPool" ref="threadPool" />
    	<property name="dataSource" ref="dataSource" />
    </bean>
    
    <bean id="springScheduleExecutorTask" class="org.springframework.scheduling.concurrent.ScheduledExecutorTask">
    	<property name="runnable" ref="collectSalesOrderExecutor" />
    	<!-- 容器加载10秒后开始执行 -->
    	<property name="delay" value="10000" />
    	<!-- 每次任务间隔 30秒-->
    	<property name="period" value="30000" />
    	
    </bean>
    
    <bean id="springScheduledExecutorFactoryBean" class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean">
    	<property name="scheduledExecutorTasks" >
    	<list>
    		<ref bean="springScheduleExecutorTask" />
    	</list>
    	</property>
    </bean>

 

 

5、java调用

(1) collectSalesOrderExecutor.java

 

public class CollectSalesOrderExecutor extends TimerTask {

	//注入ThreadPoolTaskExecutor 到主线程中
	private ThreadPoolTaskExecutor threadPool;
	private JdbcTemplate template;
	
	public void setThreadPool(ThreadPoolTaskExecutor threadPool) {
		this.threadPool = threadPool;
	}
	
	//注入数据源
	public void setDataSource(DataSource dataSource) {
		this.template = new JdbcTemplate(dataSource);
	}

	@Override
	public void run() {
		System.out.format("开始执行 %s ...%n", new Date());
		@SuppressWarnings("unchecked")
		//取得设备列表
		List<Equipment> ipList = template.query("select e.* from equipment e ", ParameterizedBeanPropertyRowMapper.newInstance(Equipment.class));
		if (ipList != null) {
			for (Equipment equipment : ipList) {
				try {
					//执行向各个设备采集数据并保存数据库
					threadPool.execute(new CollectSalesOrderTask(template,equipment.getIp()));
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}

	}

}

 

(2)CollectSalesOrderTask.java

public class CollectSalesOrderTask implements Runnable {
	private String ip;
	private JdbcTemplate template;

	public CollectSalesOrderTask(JdbcTemplate template, String ip) {
		this.template = template;
		this.ip = ip;
	}

	@Override
	public void run() {
		// 连接设备
		System.out.format("执行采集数据 %s ...%n", ip);
		//接收设备数据
		List<Report> list = JhscaleCommunicationUtils.getDeviceSales(this.ip);
		//保存本地数据库
		if (list != null && !list.isEmpty())
			storeSalesOrder(list);
	}
}

 

 

 

6、遇到的一个问题处理,即PC机作为服务器使用,可能长时间不关机,隔天之后会报如下错误:

Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

 

原因:Mysql服务器默认的“wait_timeout”是8小时【也就是默认的值默认是28800秒】,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection,通俗的讲就是一个连接在8小时内没有活动,就会自动断开该连接。

 

解决:如下

D:\MySQL\MySQL Server 5.1\my.ini
[mysqld]

# The TCP/IP Port the MySQL Server will listen on
port=3306

---------位置下面添加-----------
# this is myown dinifition for mysql connection timeout
wait_timeout=31536000
interactive_timeout=31536000

 

分享到:
评论

相关推荐

    spring 任务调度

    在IT行业中,Spring框架是Java开发中的一个核心组件,它提供了丰富的功能,包括但不限于依赖注入、AOP(面向切面编程)以及我们今天要讨论的重点——任务调度。Spring的任务调度模块使得开发者能够在应用中轻松地...

    struts2-spring-plugin-2.3.24.1.jar

    最新struts2-spring-plugin-2.3.24.1.jar

    struts2-spring-plugin-2.2.1.jar

    struts2-spring-plugin-2.2.1.jarstruts2-spring-plugin-2.2.1.jarstruts2-spring-plugin-2.2.1.jar

    mybatis-spring整合jar包

    - 在多线程环境下,使用SqlSessionTemplate可以确保线程安全。 总的来说,MyBatis-Spring整合简化了在Spring应用中使用MyBatis的过程,提高了开发效率,并且提供了良好的事务管理和依赖注入功能。通过正确配置和...

    spring任务调度(Quartz )

    Spring中的任务调度是实现应用程序自动化运行任务的重要工具,而Quartz是Java领域广泛使用的开源任务调度框架。在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作...

    maven管理的Spring多线程任务demo

    总结来说,"maven管理的Spring多线程任务demo"是一个结合了Maven项目管理、Spring框架和多线程编程的示例。通过学习这个示例,开发者可以更好地理解如何在Spring中配置和使用线程池,从而高效地处理并发任务,提高...

    Spring实现任务调度

    Spring框架提供了强大的任务调度能力,使得开发者能够轻松地在Java环境中实现这一功能。本篇将深入探讨如何利用Spring进行任务调度,并结合代码演示和Quartz库的使用来丰富这一主题。 首先,Spring提供了两种主要的...

    mybatis-spring-1.2.3-source.zip

    本文将基于提供的mybatis-spring-1.2.3-source.zip源码,深入探讨MyBatis-Spring的整合机制和核心功能。 1. **MyBatis-Spring的整合背景** MyBatis是一个轻量级的ORM(对象关系映射)框架,它解决了SQL与Java代码...

    struts2-spring-plugin-2.1.8.1.jar

    struts2-spring-plugin-2.1.8.1.jar

    Spring实现任务调度.rar

    Spring框架提供了强大的任务调度能力,使得开发者能够轻松地集成和管理定时任务。本资料“Spring实现任务调度”将深入探讨如何在Spring中设置和管理定时任务。 首先,我们需要理解Spring中的任务调度机制。Spring...

    spring 任务调度实现代码例子

    在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。这个“spring 任务调度实现代码例子”很可能是包含了一些示例代码,用于演示如何在Spring应用中配置和使用任务调度...

    spring分布式任务调度

    8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; 10、邮件报警:任务失败时支持邮件报警,支持配置多...

    struts2-spring-plugin-2.3.4.1.jar

    struts2-spring-plugin 最新jar包(2012.10.22) 0分资源,方便你我

    soft-spring demo

    总结来说,"soft-spring demo"是一个展示了如何在Spring应用中集成和使用Quartz Scheduler的实例,它涉及到Spring的DI和AOP特性,以及Quartz的作业调度功能。通过这个项目,开发者可以学习如何创建、管理和执行定时...

    mybatis+mybatis-springjar包

    在给定的压缩包中,包含两个核心的 JAR 文件:mybatis-3.2.6.jar 和 mybatis-spring-1.2.2.jar。这两个 JAR 文件是 MyBatis 和 MyBatis-Spring 框架的核心组件,用于整合 Spring 框架和 MyBatis,实现更高效且灵活的...

    202318-Spring Cloud面试题(2023最新版)思维导图.zip

    - 多线程编程 2. 数据库: - 熟悉SQL语言 - 了解关系型数据库和非关系型数据库 - 数据库连接池 - 数据库事务 3. Spring框架: - Spring Boot - Spring MVC - Spring Data - Spring Security - Spring...

    Spring3.0 mvc 定时器及多线程任务demo

    总结,Spring 3.0 MVC中的定时器和多线程任务是提升应用程序效率的重要工具。定时器可以帮助我们定期执行特定任务,而多线程则可以提高程序并发能力,减少等待时间。通过合理利用这两个特性,我们可以构建出更健壮、...

    Spring的多线程应用

    在【标题】"Spring的多线程应用"中,我们关注的是Spring如何支持和管理多线程,这是现代并发编程的一个关键特性。在【描述】中提到的"一个简单的spring的多线程demo",我们可以理解为一个示例项目,旨在帮助开发者...

    基于Spring Boot的微任务分布式调度框架设计源码 - spring-boot-micro-job

    本源码提供了一个基于Spring Boot的微任务分布式调度框架的设计。项目包含61个文件,其中包括22个Java文件、21个XML文件、8个YML文件、3个Markdown文档、1个gitignore文件、1个Properties文件、1个LICENSE文件、1个...

    202306-Spring面试题((2023最新版)思维导图.zip

    - 多线程编程 2. 数据库: - 熟悉SQL语言 - 了解关系型数据库和非关系型数据库 - 数据库连接池 - 数据库事务 3. Spring框架: - Spring Boot - Spring MVC - Spring Data - Spring Security - Spring...

Global site tag (gtag.js) - Google Analytics