补充---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小时内没有活动,就会自动断开该连接

时间: 2024-08-02 19:33:59

补充---spring多线程任务调度的相关文章

spring 多线程 注入 服务层 问题

在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://hi.baidu.com/adrianbutler/item/800218d90f23b0e53dc2cb95 因为我用的是@Autowired注入,不知道为什么 解决不了我的问题,继续查找资料,好在柳暗花明 详细: http://blog.csdn.net/majian_1987/article/d

Spring多线程

Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 实例代码: (1)配置类 package com.lwh.highlight_spring4.ch3.taskexecutor; /**

Spring 多线程

Spring 通过任务执行器TaskExecutor来实现多线程和并发编程. 使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor. 使用@EnableAsync开启对一处任务的支持,并通过在实际执行的Bean方法中使用@Asycn注解声明其实一个异步任务. 例: 1. 创建Spring 任务执行器 package com.cz.thread; import org.springframework.aop.interceptor.AsyncUncaugh

spring quartz 任务调度

Quartz是一个强大的企业级任务调度框架,spring 提供了对quartz的整合,下面来说一下具体的步骤: 1,俗话说"工欲善其事,必先利其器",首先要把quartz的包导入项目中,以下是maven项目的依赖包: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6&

任务调度(四)——ScheduledExecutorService替代Timer,实现多线程任务调度

上篇博文<任务调度(三)--Timer的替代品ScheduledExecutorService简介>已经对ScheduledExecutorService做了简单介绍,其实使用ScheduledExecutorService来替代Timer也是迫不得已的事情.主要原因如下: Timer不支持多线程,所有挂在Timer下的任务都是单线程的,任务只能串行执行,如果其中一个任务执行时间过长,会影响到其他任务的执行,然后就可能会有各种接踵而来的问题. Timer的线程不捕获异常,TimerTask如果

Spring的任务调度 SpringTask

在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的任务调度框架有Quartz和SpringTask等. 一.SpringTask入门小demo 首先在spring的配置文件加入如下配置: <context:component-scan base-package="com.xxx.task"/> <!-- 扫描包 --> <task:annota

京东后端Java高级架构师面经+面试题:Spring+多线程+NIO+MySQL

之前面了腾讯的提前批,不过没走流程.同期还面了阿里的两轮面试,被告知不走流程就不能面了,所以也没面完. 后来走了京东这边的流程.前几天刚刚面完HR. 正好今天分享一下面经,大家可以多交流交流哈. 京东面经 第一轮:电话初面 第二轮:技术面谈 第三轮:高管复试 第四轮:HR最后确认 第一轮电话初面: 首先确认对京东的意向度(如果异地更会考虑对工作地点(北京)的意向度!京东很看重这个):其次面试官一般会针对您所做过的项目来做具体技术的交流,会比较关注个人对项目细节是不是掌握到位,主要考察Java的技

联想高级Java研发面经+面试题:Spring+多线程+MySQL+设计模式

上个礼拜,之前的一个同事突然联系我说他去面了联想的JAVA开发工程师,想分享一下面试经历和面试题.我当时就拍板说,好啊! 然后就整理了一下,写了这篇文章:和大家分享一下这次面试经验和面试题. 薪资还可以啊,年薪40W+啊!多少人的梦想啊! 言归正传,和大家分享一下这次联想的面经和面试题: 联想面经: 第一轮:电话初面 第二轮:技术面谈 第三轮:高管复试 第四轮:HR最后确认 No.1:第一轮面试--电话初面 首先确认对联想的意向度(如果异地更会考虑对工作地点(北京)的意向度!联想很看重这个):其

Spring(任务调度)

1.任务调度