Spring 动态添加定时计划,在每天指定时间将第二天的任务添加到计划列表中,定时执行

quzrtz.xml  此文件为定时任务配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- KPI 考核每天 夜晚 12:00  扫描后,将第二天要执行的任务放在  定时任务池中   以便第二天准时执行 -->

<bean id="informationPushTask" class="com.icloudmoosoft.system.timer.kpiplan.InformationPushTask">

<property name="scheduler" ref="schedulerFactory"/>

<property name="baseDao" ref="BaseDao"></property>

</bean>

<!-- 配置定时任务,用于初始化定时器 -->

<bean id="executionJobDetail"    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

<property name="targetObject">

<ref bean="informationPushTask"/>

</property>

<property name="targetMethod">

<value>initJobTrigger</value>

</property>

<property name="concurrent" value ="false"/>

</bean>

<bean id="initTrigger"  class="org.springframework.scheduling.quartz.CronTriggerBean">

<property name="jobDetail">

<ref bean="executionJobDetail"/>

</property>

<property name="cronExpression">

<value>0 42 16 ? * *</value>

</property>

</bean>

<!-- 总管理类 如果将lazy-init=‘false‘那么容器启动就会执行调度程序  -->

<bean id="schedulerFactory" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="triggers">

<list>

<ref bean="CooperateManagerTaskDoTime"/>  <!-- 扫描申请事项的任务 -->

<ref bean="InitAttendanceManagerTaskDoTime"/>  <!-- 每年初始化 假期管理中的数据   加班,请假清空,年假初始化 -->

<ref bean="initTrigger"/>

</list>

</property>

</bean>

</beans>

public class InformationPushTask {

//获得工厂

private Scheduler scheduler;

private BaseDao baseDao;

public void setScheduler(Scheduler scheduler) {

this.scheduler = scheduler;

}

public void setBaseDao(BaseDao baseDao) {

this.baseDao = baseDao;

}

//初始化数据库任务

public void initJobTrigger(){

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("初始化数据 start :"+sf.format(new Date()));

public class JobInformationPushTask implements Job{

private BaseDao baseDao;

public void executionTask(Integer iPId){

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("执行任务开始。。。"+iPId+"__dateTime:"+sf.format(new Date()));

}

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

try{

baseDao=(BaseDao)context.getScheduler().getContext().get("baseDao");

if(null!=context){

//ID 不能用context.getScheduler().getContext() 来传 除非你只有一个任务,因为工厂只初始化一次

String strId= context.getJobDetail().getName();

executionTask(Integer.parseInt(strId .substring(strId.lastIndexOf("_")+1,strId.length())));

}

}catch (Exception e) {

e.printStackTrace();

}

}

}

//添加第二天需要执行的任务到 任务池 里面

List<KpiPlanBatch> listMap = baseDao.selectList("hr.pjxt.kpiplanbatch.kpiPlanBatch");

System.out.println("listMap.size():"+listMap.size());

if(!listMap.isEmpty()){

try {

for (KpiPlanBatch kplan : listMap) {

insertTrigger(kplan.getJobTime(),kplan.getbNum());

System.out.println("插入定时任务信息:"+kplan.getId());

}

} catch (Exception e) {

e.printStackTrace();

}

}

//移除初始化触发器

try {

scheduler.unscheduleJob("initTrigger", Scheduler.DEFAULT_GROUP);

scheduler.start();

} catch (SchedulerException e) {

e.printStackTrace();

}

}

//下达任务

public boolean insertTrigger(Date dtime,Integer id){

//验证是否有任务

try {

SimpleTrigger checkSimpleTrigger = (SimpleTrigger)scheduler.getTrigger("trigger_" + id, Scheduler.DEFAULT_GROUP);

if(null != checkSimpleTrigger){

return false;

}

} catch (SchedulerException e1) {

e1.printStackTrace();

}

if(null!=dtime){

try {

//动态及动态产生一个人任务  跟一个触发器 交由Scheduler工厂管理

//1.新建一个任务  2.分配入默认的组 3.执行工作的BEAN 需实现JOB 接口  并实现execute方法

JobDetail jobDetail =  new JobDetail("reportJob_" + id, Scheduler.DEFAULT_GROUP,JobInformationPushTask.class);

//复杂的定时任务

SimpleTrigger trigger = new SimpleTrigger("trigger_" + id,Scheduler.DEFAULT_GROUP,dtime,null,0,0L);

//JOB的BEAN 传值 可以是DAO  也可以是connection

scheduler.getContext().put("baseDao",baseDao);

//启动新增定时器任务

scheduler.scheduleJob(jobDetail, trigger);

return true;

} catch (Exception e) {

//你懂的

revokeTask(id);

e.printStackTrace();

}

}

return false;

}

//删除任务

public void revokeTask(Integer ipId){

try {

//移除触发器

SimpleTrigger simpleTrigger = (SimpleTrigger)scheduler.getTrigger("trigger_" + ipId, Scheduler.DEFAULT_GROUP);

if(null != simpleTrigger){

scheduler.unscheduleJob(simpleTrigger.getName(), Scheduler.DEFAULT_GROUP);

}

} catch (SchedulerException e) {

e.printStackTrace();

}

}

}

时间: 2024-08-27 01:35:07

Spring 动态添加定时计划,在每天指定时间将第二天的任务添加到计划列表中,定时执行的相关文章

Quartz 2.x与Spring 动态整合

一.Quartz简介 Quartz是一个由James House创立的开源项目,是一个功能强大的作业调度工具,可以计划的执行任务,定时.循环或在某一个时间来执行我们需要做的事,这可以给我们工作上带来很大的帮助.例如,你的程序中需要每个月的一号导出报表.定时发送邮件或程序需要每隔一段执行某一任务--等等,都可以用Quartz来解决. Quartz大致可分为三个主要的核心: 1.调度器Scheduler:是一个计划调度器容器,容器里面可以盛放众多的JobDetail和Trigger,当容器启动后,里

Spring 动态代理基础知识

Spring AOP 使用动态代理技术在运行期织入增强的代码,为了揭示 Spring AOP 底层的工作机理,有必要学习涉及的 Java 知识.Spring AOP 使用了两种代理机制:一种是基于 JDK 的动态代理:另一种是基于 CGLib 的动态代理.之所以需要两种代理机制,很大程度上是因为 JDK 本身只提供接口的代理,而不支持类的代理. 1.带有横切逻辑的实例 下面通过具体化代码实现一个性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类

spring 动态定时任务

功能介绍:商品自动上架.按修改或添加时设置的自动上架时间而启动定时任务 更改商品状态为上架. spring 中配置文件 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&q

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 [sql] view plaincopy <span style="font-family: 'Microsoft YaHei'; font-size: 14px;">MySQL定时任务event</span> 由于一些业务需求,我们可能需要定时清除数据库一些废弃的数据

Spring 动态代理 之 but was actually of type &#39;com.sun.proxy.$Proxy14 Exception

今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'inter1' is expected to be of type 'com.dengchengchao.springtest.intertest.Inter1Impl' but was actually of type 'co

spring动态切换数据源(一)

介绍下spring数据源连接的源码类:| 1 spring动态切换连接池需要类AbstractRoutingDataSource的源码 2 /* 3 * Copyright 2002-2017 the original author or authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in comp

每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容

前言: 这里主要是针对列表中的文件下新增子项的操作,同时在新建子项时,可以为子项指定特定的内容类型,在某些时候需要查询指定的文件夹下的内容,针对这些场景都一一给力示例和说明,都是一些很小的知识点,希望能够对大家有所帮助. 1.   在列表中为列表项添加子项 为列表添加子项大家都很熟悉,但是如何为列表项添加子项呢?例如列表项是一个文件夹,如何为该文件夹添加子项呢?这里就用到了List.AddItem()方法,具体示例如下: 首先我们要获取列表中的子项: SPListItem root_item=l

Spring动态数据源实现读写分离

一.创建基于ThreadLocal的动态数据源容器,保证数据源的线程安全性 package com.bounter.mybatis.extension; /** * 基于ThreadLocal实现的动态数据源容器,保证DynamicDataSource的线程安全性 * @author simon * */ public class DynamicDataSourceHolder { private static final ThreadLocal<String> dataSourceHolde

Spring动态配置多数据源

Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. 基本信息 1.Spring配置多数据源的方式和具体使用过程. 2.Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况: 一是,表级上的跨数据库.即,对于不同的数据库却有相同的表(表名和表结构完全相