补充---spring多线程任务调度
在spring任务调度的基础上增加多线程
三种方式:
(1)使用OpenSymphony Quartz 调度器
(2)使用JDK Timer支持类
(3)SpringTaskExecutor抽象
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>
java后台调用
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();
                }
            }
        }
    }
} 
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);
    }
} 
注意:
遇到的一个问题处理,即PC机作为服务器使用,可能长时间不关机,隔天之后会报如下错误:
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
原因:Mysql服务器默认的“wait_timeout”是8小时【也就是默认的值默认是28800秒】,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection,通俗的讲就是一个连接在8小时内没有活动,就会自动断开该连接
补充---spring多线程任务调度的更多相关文章
- Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析
		原文地址: https://blog.csdn.net/yx0628/article/details/80873774 一个简单的Spring定时任务的 demo,全部代码见下载地址:https:// ... 
- spring 多线程 注入 服务层 问题
		在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://h ... 
- spring多线程与定时任务
		本篇主要描述一下spring的多线程的使用与定时任务的使用. 1.spring多线程任务的使用 spring通过任务执行器TaskExecutor来实现多线程与并发编程.通常使用ThreadPoolT ... 
- spring多线程初探
		6月14号 晴 最高温度37 今天很热的一天啊,开发的任务现在正在测试阶段,手头没有什么工作任务,忙里偷闲,丰富一下我的blog. 前两天有个需求:调用第三方接口,这个接口的响应时间有点长,需 ... 
- Spring Schedule 任务调度实现
		我们都知道任务调度可以用Quartz,但对于简单的定时任务,可以直接用Spring内置的Schedule来实现.可以由两种方式,注释+XML配置 注解方式: 注解也要先在sping.xml配置文件中配 ... 
- Spring task任务调度详解
		spring内部有一个task是Spring自带的一个设定时间自动任务调度 task使用的时候很方便,但是他能做的东西不如quartz那么的多! 可以使用注解和配置两种方式,配置的方式如下 引入Spr ... 
- Spring多线程批量发送邮件(ThreadPoolTaskExecutor)
		1,需求:使用多线程批量发送邮件 需要批量发送邮件大概400封左右,但是因为发送邮件受网络限制,所以经常导致等待超时.所以就想到了使用多线程来发邮件,因为是异步的所以返回结果不受发邮件影响. 2,思路 ... 
- 解决spring多线程不共享事务的问题
		在一个事务中使用多线程操作数据库时,若同时存在对数据库的读写操作,可能出现数据读取的不准确,因为多线程将不会共享同一个事务(也就是说子线程和主线程的事务不一样),为了解决这个问题,可以使用spring ... 
- spring多线程
		Spring4.x高级话题(二):多线程 一. 点睛 Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池 ... 
随机推荐
- 使用 SourceTree 管理ios项目
			SourceTree 是一个非常优秀的版本控制软件,他是一个客户端,方便我们去接入 GitHub .BitBucke 上面托管的代码. 声明(1——4是来自简书的非个人作品,仅仅保存资料学习使用) 一 ... 
- CCF 201509-3	模板生成系统 (STL+模拟)
			问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerr ... 
- 让webStorm支持自动监听编译scss文件
			前提概要 今日,重装了两波系统,,,之前安装的各种环境都忘光了,重新又踩一次坑的感觉很不舒服,所以记录一下配置自动编译scss一路遇到的坑 一.webstrom run的时候控制台输出的错误中文提示乱 ... 
- 洛谷 - UVA11346 - 概率 Probability - 积分
			要是没学过高等数学的积分怎么办呢?可以求助于自适应辛普森法. 容易发现其实这个图形是对称的,我们只要求第一象限就可以了,第一象限如上图. 由于取点是在面积内等概率的,由高中的几何概型可知,所求概率为: ... 
- STLstack,queue
			今天一开始用C去摸栈和队列,差不多昨天早上也在摸,摸烦了就去搞DP然后DP也没搞好,就是很烦很烦!!!! 然后今天那些C的栈队列的步骤和名称熟的不要不要的,然而数据结构的c语言用指针,传递,简直麻烦, ... 
- 51nod1086(多重背包&二進制)
			題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 題意:中文題誒- 思路:很顯然這是一道多重背包題,不過這 ... 
- 2014-6-28 NOIP模拟赛
			[今天我出的三道题目全部是图论哦,请大家轻虐] 1.魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的 ... 
- Shiro 权限管理框架
			一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ... 
- Windows类标识符及其妙用
			Windows类标识符 百度百科这样解释: Windows的类标识符class identifier也称为CLASSID或CLSID,是与某一个类对象相联系的唯一标记(UUID).一个准备创建多个对象 ... 
- 用css固定textarea文本域大小尺寸
			textarea元素在chrome等浏览器下可以被拖拉从而改变大小,对于查看textarea里面的内容来说相当方便,但是有时候 我们为了保持网页的美观,不得不想要禁掉这个功能,禁止用户随意拉动text ... 
