spring与quartz整合实现分布式动态创建,删除,改变执行时间定时任务(mysql数据库)
背景:因为在项目中用到了定时任务,当时想到了spring的quartz,写完发现费了很大功夫,光是整合就花了一上午,其中最大的问题就是版本问题,项目中用的是spring3.2.8的版本,查阅发现,3.0以上的版本需要使用quartz2.X以上版本,我就去官网下载了2.1.7的quartz,结果发现jar包与spring冲突,最后使用了quartz1.6.0版本。
spring与quartz整合第一步需要导jar包,这个在百度搜下quartz的jar,下载一个
第二步:分布式定时任务,是基于数据库的,quartz完成定时任务需要其自身的表结构支撑,所以需要在mysql中创建表,1.X的版本,与2.X的数据库表结构不一样,这些sql脚本可以在你下载的quartz.zip包中doc中含有,下面是我的sql脚本(1.X版本的sql语句)
/*
SQLyog Ultimate v11.24 (32 bit)
MySQL - 5.5.27 : Database - tss_v1
*********************************************************************
*/ /*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tss_v1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `tss_v1`;
/*Table structure for table `qrtz_blob_triggers` */
DROP TABLE IF EXISTS `qrtz_blob_triggers`;
CREATE TABLE `qrtz_blob_triggers` (
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`BLOB_DATA` blob,
PRIMARY KEY (`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `TRIGGER_NAME` (`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_blob_triggers` */
/*Table structure for table `qrtz_calendars` */
DROP TABLE IF EXISTS `qrtz_calendars`;
CREATE TABLE `qrtz_calendars` (
`CALENDAR_NAME` varchar(200) NOT NULL,
`CALENDAR` blob NOT NULL,
PRIMARY KEY (`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_calendars` */
/*Table structure for table `qrtz_cron_triggers` */
DROP TABLE IF EXISTS `qrtz_cron_triggers`;
CREATE TABLE `qrtz_cron_triggers` (
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`CRON_EXPRESSION` varchar(120) NOT NULL,
`TIME_ZONE_ID` varchar(80) DEFAULT NULL,
PRIMARY KEY (`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `TRIGGER_NAME` (`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_cron_triggers` */
/*Table structure for table `qrtz_fired_triggers` */
DROP TABLE IF EXISTS `qrtz_fired_triggers`;
CREATE TABLE `qrtz_fired_triggers` (
`ENTRY_ID` varchar(95) NOT NULL,
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`IS_VOLATILE` varchar(1) NOT NULL,
`INSTANCE_NAME` varchar(200) NOT NULL,
`FIRED_TIME` bigint(13) NOT NULL,
`PRIORITY` int(11) NOT NULL,
`STATE` varchar(16) NOT NULL,
`JOB_NAME` varchar(200) DEFAULT NULL,
`JOB_GROUP` varchar(200) DEFAULT NULL,
`IS_STATEFUL` varchar(1) DEFAULT NULL,
`REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
PRIMARY KEY (`ENTRY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_fired_triggers` */
/*Table structure for table `qrtz_job_details` */
DROP TABLE IF EXISTS `qrtz_job_details`;
CREATE TABLE `qrtz_job_details` (
`JOB_NAME` varchar(200) NOT NULL,
`JOB_GROUP` varchar(200) NOT NULL,
`DESCRIPTION` varchar(250) DEFAULT NULL,
`JOB_CLASS_NAME` varchar(250) NOT NULL,
`IS_DURABLE` varchar(1) NOT NULL,
`IS_VOLATILE` varchar(1) NOT NULL,
`IS_STATEFUL` varchar(1) NOT NULL,
`REQUESTS_RECOVERY` varchar(1) NOT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`JOB_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_job_details` */
/*Table structure for table `qrtz_job_listeners` */
DROP TABLE IF EXISTS `qrtz_job_listeners`;
CREATE TABLE `qrtz_job_listeners` (
`JOB_NAME` varchar(200) NOT NULL,
`JOB_GROUP` varchar(200) NOT NULL,
`JOB_LISTENER` varchar(200) NOT NULL,
PRIMARY KEY (`JOB_NAME`,`JOB_GROUP`,`JOB_LISTENER`),
KEY `JOB_NAME` (`JOB_NAME`,`JOB_GROUP`),
CONSTRAINT `qrtz_job_listeners_ibfk_1` FOREIGN KEY (`JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_job_listeners` */
/*Table structure for table `qrtz_locks` */
DROP TABLE IF EXISTS `qrtz_locks`;
CREATE TABLE `qrtz_locks` (
`LOCK_NAME` varchar(40) NOT NULL,
PRIMARY KEY (`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_locks` */
insert into `qrtz_locks`(`LOCK_NAME`) values ('CALENDAR_ACCESS'),('JOB_ACCESS'),('MISFIRE_ACCESS'),('STATE_ACCESS'),('TRIGGER_ACCESS');
/*Table structure for table `qrtz_paused_trigger_grps` */
DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;
CREATE TABLE `qrtz_paused_trigger_grps` (
`TRIGGER_GROUP` varchar(200) NOT NULL,
PRIMARY KEY (`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_paused_trigger_grps` */
/*Table structure for table `qrtz_scheduler_state` */
DROP TABLE IF EXISTS `qrtz_scheduler_state`;
CREATE TABLE `qrtz_scheduler_state` (
`INSTANCE_NAME` varchar(200) NOT NULL,
`LAST_CHECKIN_TIME` bigint(13) NOT NULL,
`CHECKIN_INTERVAL` bigint(13) NOT NULL,
PRIMARY KEY (`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `qrtz_simple_triggers` */
DROP TABLE IF EXISTS `qrtz_simple_triggers`;
CREATE TABLE `qrtz_simple_triggers` (
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`REPEAT_COUNT` bigint(7) NOT NULL,
`REPEAT_INTERVAL` bigint(12) NOT NULL,
`TIMES_TRIGGERED` bigint(10) NOT NULL,
PRIMARY KEY (`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `TRIGGER_NAME` (`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_simple_triggers` */
/*Table structure for table `qrtz_trigger_listeners` */
DROP TABLE IF EXISTS `qrtz_trigger_listeners`;
CREATE TABLE `qrtz_trigger_listeners` (
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`TRIGGER_LISTENER` varchar(200) NOT NULL,
PRIMARY KEY (`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_LISTENER`),
KEY `TRIGGER_NAME` (`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_trigger_listeners_ibfk_1` FOREIGN KEY (`TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_trigger_listeners` */
/*Table structure for table `qrtz_triggers` */
DROP TABLE IF EXISTS `qrtz_triggers`;
CREATE TABLE `qrtz_triggers` (
`TRIGGER_NAME` varchar(200) NOT NULL,
`TRIGGER_GROUP` varchar(200) NOT NULL,
`JOB_NAME` varchar(200) NOT NULL,
`JOB_GROUP` varchar(200) NOT NULL,
`IS_VOLATILE` varchar(1) NOT NULL,
`DESCRIPTION` varchar(250) DEFAULT NULL,
`NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
`PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
`PRIORITY` int(11) DEFAULT NULL,
`TRIGGER_STATE` varchar(16) NOT NULL,
`TRIGGER_TYPE` varchar(8) NOT NULL,
`START_TIME` bigint(13) NOT NULL,
`END_TIME` bigint(13) DEFAULT NULL,
`CALENDAR_NAME` varchar(200) DEFAULT NULL,
`MISFIRE_INSTR` smallint(2) DEFAULT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `JOB_NAME` (`JOB_NAME`,`JOB_GROUP`),
CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `qrtz_triggers` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
表创建完成后,第三步就是创建quartz.properties文件
#============================================================================
# Configure Main Scheduler Properties
#============================================================================ org.quartz.scheduler.instanceName = ClusteredScheduler #scheduler 名称,用于区分,集群中使用同一个名称
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.skipUpdateCheck = true #============================================================================
# Configure ThreadPool
#============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5 #============================================================================
# Configure JobStore
#============================================================================ org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval =15000
第四步:创建spring-quartz配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<description>spring任务调度,quartz任务调度,该文件是空配置,确保能启动定时任务,具体
业务配置需在页面进行配置即可,不用描述在该文件中</description> <task:annotation-driven executor="quartzTaskExecutor" />
<task:executor id="quartzTaskExecutor" keep-alive="900" pool-size="10" queue-capacity="20" /> <!-- Quartz集群Schduler -->
<bean id="clusterQuartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- Triggers集成 动态配置 -->
<!-- <property name="triggers">
<list>
<ref bean="allocationPlanTrigger" />
</list>
</property> -->
<!-- quartz配置文件路径, 指向cluster配置 -->
<property name="configLocation" value="classpath:quartz.properties" />
<!-- 启动时延期2秒开始任务 -->
<property name="startupDelay" value="2" />
<!-- 保存Job数据到数据库所需的数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- Job接受applicationContext的成员变量名 -->
<property name = "schedulerContextAsMap">
<map>
<!-- spring管理的服务需要放到这里,才能够注入成功 -->
<description> schedulerContextAsMap </description >
<entry key = "allocationOrderService" value-ref = "allocationOrderService" />
</map >
</property >
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<!-- 修改job时,更新到数据库 -->
<property name="overwriteExistingJobs" value="true" />
</bean> <!-- 定时任务 页面动态配置-->
<!-- <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myTask" />
每5秒执行一次
<property name="cronExpression" value="*/5 * * * * ? " />
</bean>
<bean id="myTask" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="durability" value="true" />
<property name="jobClass" value="com.yestae.tss.common.quartz.task.MyTask" />
</bean> -->
</beans>
因为是基于页面进行动态配置的,所以只注册scheduler,如果你的自定义任务里需要使用spring的bean,schedulerContextAsMap 可以帮你完成注入,但在你的执行任务里要写get和set方法,不需要使用注解。
第五步:创建我们需要执行的任务类
package com.yestae.tss.common.quartz.task; import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean; import com.yestae.tss.allocation.service.IAllocationOrderService; public class AllocationPlanTask extends QuartzJobBean {
private IAllocationOrderService allocationOrderService; //注入service,記得生成get和set方法,才能注入成功
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
//TODO 执行自己的任务
System.out.println(allocationOrderService+"---"+new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss").format(new Date()));
} public IAllocationOrderService getAllocationOrderService() {
return allocationOrderService;
}
public void setAllocationOrderService(
IAllocationOrderService allocationOrderService) {
this.allocationOrderService = allocationOrderService;
} }
基本上完成就差不多了,下面来进行定时器的动态管理,直接上代码
接口
package com.yestae.tss.common.quartz.service; import java.text.ParseException;
import java.util.List; import org.quartz.SchedulerException; import com.yestae.tss.common.quartz.VO.QuartzJobVo; public interface ISchedulerService { /**
* @Description: 添加一个定时任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
* @param jobClass
* 任务
* @param time
* 时间设置,参考quartz说明文档
* @throws ParseException
* @throws SchedulerException
*/
Boolean addJod(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,
String time) throws ParseException, SchedulerException; /**
* @Description: 移除一个任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
*
*/
public void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName) throws ParseException, SchedulerException; /**
* @Description: 修改一个任务的触发时间
*
* @param triggerName
* 触发器名称
* @param triggerGroupName
* 触发器组名称
* @param time
*
*/
public Boolean modifyJobTime(String triggerName,
String triggerGroupName, String time) throws ParseException, SchedulerException; /**
* @Description: 修改一个任务的触发时间
*
* @param triggerName
* 触发器名称
* @param triggerGroupName
* 触发器组名称
*
*/
public List<QuartzJobVo> getTriggerS(String triggerName,
String triggerGroupName) throws ParseException, SchedulerException; /**
* @Description: 暂停任务,但当前任务会执行完毕,执行完毕则不会继续执行了
*
* @param jobName
* 任务名称
* @param groupName
* 任务组名称
*
*/
public void pauseJob(String jobName,
String groupName) throws SchedulerException; }
package com.yestae.tss.common.quartz.service; import java.text.ParseException;
import java.util.ArrayList;
import java.util.List; import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.google.common.collect.Lists;
import com.yestae.tss.common.quartz.VO.QuartzJobVo; @Service
public class SchedulerServiceImpl implements ISchedulerService {
@Autowired
private Scheduler scheduler; @Override
public Boolean addJod(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,
String time) throws ParseException, SchedulerException { JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
jobDetail.setDurability(true); //任务完成后任然将任务保存在数据库
// 触发器
CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
trigger.setCronExpression(time);// 触发器时间设定
scheduler.scheduleJob(jobDetail, trigger); return null;
} @Override
public void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName) throws ParseException,
SchedulerException { scheduler.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
scheduler.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
scheduler.deleteJob(jobName, jobGroupName);// 删除任务
return;
} @Override
public Boolean modifyJobTime(String triggerName, String triggerGroupName,
String time) throws ParseException, SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerName,triggerGroupName);
if (trigger == null) {
return false;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
// 修改时间
trigger.setCronExpression(time);
// 重启触发器
scheduler.resumeTrigger(triggerName, triggerGroupName);
}
return null;
} @Override
public List<QuartzJobVo> getTriggerS(String triggerName, String triggerGroupName)
throws ParseException, SchedulerException {
List<QuartzJobVo> list = Lists.newArrayList();
//获取任务名称
for (String groupName : scheduler.getJobGroupNames()) { for (String jobName : scheduler.getJobNames(groupName)) {
QuartzJobVo quartzJobVo = new QuartzJobVo();
Trigger[] triggers = scheduler.getTriggersOfJob(jobName,groupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggers[0].getName(), triggers[0].getGroup());
quartzJobVo.setJobName(jobName);
quartzJobVo.setJobGroupName(groupName);
quartzJobVo.setTriggerGroupName(triggers[0].getGroup());
quartzJobVo.setTriggerName(triggers[0].getName());
quartzJobVo.setCronExpression(trigger.getCronExpression());
list.add(quartzJobVo);
} }
return list;
} @Override
public void pauseJob(String jobName, String groupName)
throws SchedulerException {
scheduler.pauseJob(jobName, groupName);
return;
} }
前端通过参数进行添加,删除,修改相关配置就ok了,前端页面目前还没出来,等出来了,给予展示出来。
定时任务结果:
spring与quartz整合实现分布式动态创建,删除,改变执行时间定时任务(mysql数据库)的更多相关文章
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...
- Spring与MyBatis整合上_Mapper动态代理方式
将MyBatis与Spring进行整合,主要解决的问题就是将SqlSessionFactory对象交由Spring来管理..所以该整合,只需将SQLSessionFactory的对象生成器S ...
- spring与quartz整合
这周学习了quartz定时任务,现在进行总结一下.首先要认识定时任务中几个关键接口,以及各个接口之间是如何联系起来的. 1.关键接口 (1)Scheduler,任务调度的API,它可以用来启动或者终 ...
- C#动态创建Gridview及批量插入到数据库
这里介绍两种动态创建Gridview的方法: (一).有时需要应付上头领导的检查,所以就弄一些静态的Gridview来显示数据,这种方法的优点就是不用连接数据库,比较方便,但是代码灵活性不高,所有数据 ...
- 通过Shell脚本来创建批量服务器上的MySQL数据库账号
1.项目背景 因监控需要,我们需要在既有的每个MySQL实例上创建一个账号.公司有数百台 MySQL 实例,如果手动登入来创建账号很麻烦,也不现实.所以,我们写了一个简单的shell脚本,用来创建批量 ...
- PyCharm创建Django项目并连接mysql数据库
0. 安装Django pip install django 1. 新建项目 注:我的Pycharm为社区版,创建项目时,File->New Project- 显示为: 注意勾选内容. 如果 ...
- 初识spring与quartz整合实现定时任务
参考资料: http://kevin19900306.iteye.com/blog/1397744 引用自别人的博客: 特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2 ...
- Spring和Quartz整合实现定时任务调度
在Spring中可以很方便的使用Quartz来实现定时任务等功能,Quartz主要就是Schedule(任务调度器),Job(作业任务)和Trigger(触发器)三者的关系. 实现方式有多种,在此就介 ...
- Spring和quartz整合的入门使用教程
Quartz的maven依赖 <!-- quartz 的jar --> <dependency> <groupId>org.quartz-scheduler< ...
随机推荐
- 10. Extjs Button控件的handler配置项和click事件
转自:https://blog.csdn.net/lishk314/article/details/41541797 查看API: click( this, e, eOpts ) Fires when ...
- mysql数据类型和java对应表(copy)
[说明] 资料来自:http://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.html My ...
- 如何快速删除Linux下的svn隐藏文件及其他临时文件 (转载)
转自:http://blog.csdn.net/edsam49/article/details/5840489 在Linux下,你的代码工程如果是用svn进行管理的,要删除Linux kernel里的 ...
- vue商品详情页添加动画(eg)
<template> <div class="food" transition="move"></div> </tem ...
- php+ajax+jquery实现jsonp跨域
我们有这么个html文件test.html: 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 洛谷 P1233 木棍加工
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
- 制作并发布个人CocoaPods库
随着对 CocoaPods 越来越多的依赖,我们也可以尝试把自己的库发布到它上面. 1.在Github上新建一个项目(名字我随便取了一个,其他步骤截图为WCUIKit).自己做相应修改即可. 2.克隆 ...
- ActiveMQ应用
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...
- kali中的APT软件包处理工具(apt-get)、Debian软件包管理器(dpkg)、源代码压缩和Nessus安装实用指南
写在前面的话 能看懂此博客的朋友,深信你有一定的Kali基础了. 使用APT软件包处理工具(apt-get).Debian软件包管理器(dpkg)来维护.升级和安装自定义及第三方应用程序 APT软件包 ...
- MVC之参数验证(二)
MVC内部针对这此验证是如何实现的咧???现在我们就来分析一下这此验证的背后故事.... 1.ModelValidator与ModelValidatorProvider 虽然Model绑定方式的因绑定 ...