quartz 任务调度问题,每次都quartz.net 执行两次次 相隔只有几微秒

博客分类:
Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。
关于Quartz的更多信息,可以访问Quartz位于/quartz的主页。
项目中需要的jar包:
spring-framework-2.5.6\dist\spring.jar
spring-framework-2.5.6\lib\quartz\quartz-all-1.6.1.jar
spring-framework-2.5.6\lib\jakarta-commons\commons-logging.jar
spring-framework-2.5.6\lib\jakarta-commons\commons-collections.jar
spring-framework-2.5.6\lib\log4j\log4j-1.2.15.jar
下面为Quartz配置操作详述:
A:extends QuartzJobBean方法
1:定义任务(extends QuartzJobBean)
package com.sample.
import org.quartz.JobExecutionC
import org.springframework.scheduling.quartz.QuartzJobB
public class QuartzExtends extends QuartzJobBean {
& private JobData jobD //JobData为自定义类
&&&& public void executeInternal(JobExecutionContext context){
&&&&&&& System.out.println(jobData.getData()+" is executed");
&&&& }
&&&& public JobData getJobData() {
&&&&&&& return jobD
&&&& }
&&&& public void setJobData(JobData jobData) {
&&&&&&& this.jobData = jobD
&&&& }
}
JobData.java:
package onlyfun.bb.Q
import java.util.D
public class JobData {
&&& public String getData(){
&&&&&& return "Data from JobData at "+new Date().toString();
&&& }
}
& &!-- 继承quartzjobbean的配置 --&
&& &bean id="someData" class="com.sample.quartz.JobData"&&/bean&
&& &bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean"&
&&&&&& &property name="jobClass" value="com.sample.quartz.QuartzExtends"&&/property&
&&&&&& &property name="jobDataAsMap"&
&&&&&&&& &map&
&&&&&&&&&& &entry key="jobData" value-ref="someData"&&/entry&
&&&&&&&& &/map&
&&&&&& &/property&
&& &/bean&
&& &bean id="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&
&&&&&& &property name="jobDetail" ref="jobDetailBean"&&/property&
&&&&&& &property name="repeatInterval" value="2000"&&/property&
&&&&&& &property name="startDelay" value="1000"&&/property&
&& &/bean&
&!-- quartz触发器管理 --&
&bean id="sdf"
& class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&
& &!-- 添加触发器 --&
& &property name="triggers"&
&& &list&
&&&&&& &ref bean="simpleTriggerBean" /&
&&& &!--这里调用的列表,还可以添加其他的任务 --&
&& &/list&
& &/property&
注意:在JobDetailBean的jobClass属性必须提供Job的类名称,而不是Job类的实例。Job所需的数据可以在jobDataAsMap属性中设置。
在任务的周期指定上,使用SimpleTriggerBean类来指定,与TimerTask指定方式类似。
排定Job用SchedulerFactoryBean类。
完成设置后,只要在启动Spring并读取定义文件后,计划任务就会执行。
B:不需要继承的任务制定方法
使用Spring不一定需要继承QuartzJobBean类来定义1个Job类,可以使用MethodInvokingJobDetailFactoryBean来直接指定执行某个对象的方法。
1。建立调度类
package com.sample.
import java.text.SimpleDateF
import java.util.D
public class QuartzSimple{
& /*
&& * 该方法为任务调度是自动调用的方法,在这里可以实现你要实现的功能
&& */
&& public void test() {
&&& SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
&&& System.out.println(sdf.format(new Date()) + "时刻的调用");
&& }
}
2。对applicationContext.xml进行配置,配置文件如下:
&!--定时执行配置 --&
&& &bean id="testQuartz" class="com.sample.quartz.QuartzSimple" /&
&& &!-- bean触发方法配置 --&
&& &bean name="quartzBean"
&&& class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&
&&& &!-- bean名字 --&
&&& &property name="targetObject" ref="testQuartz" /&&!--目标对象--&
&&& &!-- bean方法 --&
&&& &property name="targetMethod"&&!--目标方法--&
&&&& &value&test&/value&
&&& &/property&
&&& &property name="concurrent"&&!--配置为false不允许任务并发执行--&
&&&& &value&false&/value&
&&& &/property&
&& &/bean&&&
&&&& &!-- bean触发时间配置,指定具体的时间执行 --&&&
&&&& &bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"&&&
&&&&&&&&& &!-- 触发bean配置 --&&&
&&&&&&&& &property name="jobDetail" ref="quartzBean" /&&&
&&&&&&&&& &!-- 触发时间配置 --&&&
&&&&&&&&& &property name="cronExpression"&&&
&&&&&&&&&&&& &value&0/10 * * * * ?&/value&&&
&&&&&&&&& &/property&
&&&&& &/bean&
C.web程序测试
在web.xml中对Spring进行配置,配置文件代码如下:
&!-- spring --&&&
&& &context-param&&&
&&&&&&& &param-name&contextConfigLocation&/param-name&&&
&&&&&&& &param-value&classpath:applicationContext.xml&/param-value&&&
&&& &/context-param&&&
&&& &listener&&&
&&&&&& &listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&&&
&&& &/listener&
D.CronTrigger配置格式:格式: [秒] [分] [小时] [日] [月] [周] [年]序号 说明& 是否必填 允许填写的值 允许的通配符
1 秒 是 0-59& , - * /
2 分 是 0-59& , - * /
3 小时 是 0-23 , - * /
4 日 是 1-31 , - * ? / L W
5 月 是 1-12 or JAN-DEC , - * /
6 周 是 1-7 or SUN-SAT , - * ? / L #&
7 年 否 empty 或
通配符说明:
* :表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? :表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 *
?- :表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, :表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
/ :用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
L :表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五" W :表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发&
# :序号(表示每月的第几周星期几),例如在周字段上设置"6#3"表示在每月的第三个周星期六.注意如果指定"6#5",正好第五周没有星期六,则不会触发该配置(用在母亲节和父亲节再合适不过了) 周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.常用示例: 格式: [秒] [分] [小时] [日] [月] [周] [年]
0 0 12 * * ?&&&&&&&&&& 每天12点触发
0 15 10 ? * *&&&&&&&&& 每天10点15分触发
0 15 10 * * ?&&&&&&&&& 每天10点15分触发&
0 15 10 * * ? *&&&&&&& 每天10点15分触发&
0 15 10 * * ? 2005&&&& 2005年每天10点15分触发
0 * 14 * * ?&&&&&&&&&& 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ?&&&&&&&& 每天下午的 2点到2点59分(整点开始,每隔5分触发)&
0 0/5 14,18 * * ?&&&&&&& 每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ?&&&&&&&&&&& 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED&&&&&&& 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI&&&&&& 从周一到周五每天上午的10点15分触发
0 15 10 15 * ?&&&&&&&&&&& 每月15号上午10点15分触发
0 15 10 L * ?&&&&&&&&&&&& 每月最后一天的10点15分触发
0 15 10 ? * 6L&&&&&&&&&&& 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L & 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3&&&&&&&&&& 每月的第三周的星期五开始触发
0 0 12 1/5 * ?&&&&&&&&&&& 每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ?&&&&&&&&&& 每年的11月11号 11点11分触发(光棍节)注意:使用SimpleTriggerBean类只能做简单Job与Job之间的执行周期指定,如果需要在指定时间执行,可以使用CronTriggerBean类。
SimpleTriggerBean:
&property name="startDelay" value="1000"&&/property&&property name="repeatInterval" value="2000"&&/property&
CronTriggerBean:
&property name="cronExpression" value="0 37-38 15 * * ?"/&
注意:CronTriggerBean的cronExpression属性指定格式:至少6个时间元素,上面表示每天的15:37-38分执行1次任务。
浏览 11713
Hillen.chan
浏览: 44758 次
来自: 北京
java quartz定时任务demo教程源代码下载,地址:h ...
cainiaobos 写道import org.apache. ...
import mons.httpc ...
写的很好,学习了
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Access denied |
used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website () has banned your access based on your browser's signature (3b4cf347d1886da8-ua98).现在位置:
一个应用负载部署后quartz任务执行多次,为了解决这个问题,我们可以时用分布式。
quartz框架可以支持分布式任务处理,即所有服务器组成一个集群,由同一个调度器去统一调度任务,将任务分配给不同的服务器执行,一方面能避免任务重复执行,另一方可以减轻单一服务器执行所有任务带来的性能消耗。要启用quartz的分布式任务处理只需做以下两个步骤,程序不需要进行修改:<span style="font-size: 12color: #.在数据库中创建quartz需要的表。这些表由quartz自己进行维护,用于保存数据和维护程序运行状态,这些表对于程序员是透明的,不需要关注,只需创建好表即可。建表语句已上传,里面包括各种主流数据库,我们IAM产品支持的数据库都有。<span style="font-size: 12color: #.在工程的src下增加quartz.properties配置文件,进行集群相关操作的配置。配置文件模板已上传,具体配置说明如下:#============================================================== #Configure Main Scheduler Properties #============================================================== #配置集群时,quartz调度器的id,由于配置集群时,只有一个调度器,必须保证每个服务器该值都相同,可以不用修改,只要每个ams都一样就行org.quartz.scheduler.instanceName = TestScheduler1 #集群中每台服务器自己的id,AUTO表示自动生成,无需修改org.quartz.scheduler.instanceId = AUTO #============================================================== #Configure ThreadPool #==============================================================#quartz线程池的实现类,无需修改 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool #quartz线程池中线程数,可根据任务数量和负责度来调整 org.quartz.threadPool.threadCount = 5 #quartz线程优先级org.quartz.threadPool.threadPriority = 5 #============================================================== #Configure JobStore #============================================================== #表示如果某个任务到达执行时间,而此时线程池中没有可用线程时,任务等待的最大时间,如果等待时间超过下面配置的值(毫秒),本次就不在执行,而等待下一次执行时间的到来,可根据任务量和负责程度来调整org.quartz.jobStore.misfireThreshold = 60000 #实现集群时,任务的存储实现方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示数据库存储,无需修改org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #quartz存储任务相关数据的表的前缀,无需修改 org.quartz.jobStore.tablePrefix = QRTZ_ #连接数据库数据源名称,与下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以无需修改 org.quartz.jobStore.dataSource = myDS#是否启用集群,启用,改为true,注意:启用集群后,必须配置下面的数据源,否则quartz调度器会初始化失败 org.quartz.jobStore.isClustered = false #集群中服务器相互检测间隔,每台服务器都会按照下面配置的时间间隔往服务器中更新自己的状态,如果某台服务器超过以下时间没有checkin,调度器就会认为该台服务器已经down掉,不会再分配任务给该台服务器org.quartz.jobStore.clusterCheckinInterval = 20000 #============================================================== #Non-Managed Configure Datasource #==============================================================#配置连接数据库的实现类,可以参照IAM数据库配置文件中的配置 org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver #配置连接数据库连接,可以参照IAM数据库配置文件中的配置 org.quartz.dataSource.myDS.URL = jdbc\:oracle\:thin\:@10.251.111.171\:1521\:test #配置连接数据库用户名org.quartz.dataSource.myDS.user = oracle13#配置连接数据库密码org.quartz.dataSource.myDS.password = Oracle13#配置连接数据库连接池大小,一般为上面配置的线程池的2倍org.quartz.dataSource.myDS.maxConnections = 10&下载地址: /s/1qWnAEyo 密码:5r4csponsored links
spring 定时任务jobquartz 可视化
本文介绍的是使用spring(spring继承并简化的quartz)的作业框架时,作业的可视化(管理,本文的可视化管理做的不完善)
解决办法就是使用监听器,实现job历史记录、job统计、异常记录、手动触发job
先来看一下 实现的流程
这里只需要自己实现几个监听器并注册即可
- StatisticSchedulerListener 监听触发规则triggers,一般是在spring启动和刷新时触发
- StatisticJobListener & JOB监听(监听JOB执行前和执行后)
-&StatisticTriggerListener
这里主要使用&StatisticJobListener &&
public class StatisticJobListener implements JobListener {
private static Logger log = Logger.getLogger(StatisticJobListener.class);
private static ThreadLocal&JobStatisticBean& threadLocal = new ThreadLocal&JobStatisticBean&();
public void setName(String name) {
this.name =
public String getName() {
return this.
//beginging
public void jobToBeExecuted(JobExecutionContext context) {
(&JOB将要执行... &+context.getJobDetail().getName());
JobStatisticBean jobStatisticBean = new JobStatisticBean();
jobStatisticBean.setJobName(context.getJobDetail().getName());
jobStatisticBean.setJobDetail(context.getJobDetail());
jobStatisticBean.setTrigger(context.getTrigger());
jobStatisticBean.setStartTime(new Timestamp(System.currentTimeMillis()));
jobStatisticBean.setJobExecutionContext(context);
jobStatisticBean.setJobIntance(context.getJobInstance());
threadLocal.set(jobStatisticBean);
public void jobExecutionVetoed(JobExecutionContext context) {
(&jobExecutionVetoed &+context.getJobDetail().getName());
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
(&JOB执行完毕 &+context.getJobDetail().getName());
JobStatisticBean jobStatisticBean = threadLocal.get();
if(jobStatisticBean!=null){
jobStatisticBean.setEndTime(new Timestamp(System.currentTimeMillis()));
jobStatisticBean.setTakesTime(jobStatisticBean.getEndTime().getTime()-jobStatisticBean.getStartTime().getTime());
StatisticProcessor.add(jobStatisticBean);
具体的缓存可以自己扩展,这里就是简单的使用了当前的jvm缓存,自己可以扩展Redis
public class StatisticProcessor extends Thread implements ApplicationContextAware, InitializingBean, DisposableBean {
private static Logger logJob
= Logger.getLogger(LoggerCategory.JOB_STATISTIC);
private static Logger logJobHistory
= Logger.getLogger(LoggerCategory.JOB_STATISTIC_HISTORY);
private static Logger logJobException
= Logger.getLogger(LoggerCategory.JOB_STATISTIC_EXCEPTION);
private static volatile Queue&JobStatisticBean& jobQueue = new ConcurrentLinkedQueue&JobStatisticBean&();
private static volatile Queue&SchedulerExceptionBean& exceptionQueue = new ConcurrentLinkedQueue&SchedulerExceptionBean&();
private static volatile Map&String, JobStatisticBean& jobMap = new ConcurrentHashMap&String, JobStatisticBean&();
* 手动触发JOB
* @param jobStatisticBean
* @throws Exception
public static boolean runByHand(JobStatisticBean jobStatisticBean) throws Exception{
if(jobStatisticBean==null)
JobExecutionContext context = jobStatisticBean.getJobExecutionContext();
Job job = jobStatisticBean.getJobIntance();
job.execute(context);
* 添加一个JOB的实例(使用map防止重复),并记录JOB执行记录(Queue)
* @param jobStatisticBean
public static boolean add(JobStatisticBean jobStatisticBean){
if(!jobMap.containsKey(jobStatisticBean.getJobName())) {
(&add job &+ JacksonUtil.toJsonString(jobStatisticBean));
jobMap.put(jobStatisticBean.getJobName(), jobStatisticBean);
(JacksonUtil.toJsonString(jobStatisticBean));
return jobQueue.add(jobStatisticBean);
* 添加执行异常LOG
* @param schedulerExceptionBean
public static boolean add(SchedulerExceptionBean schedulerExceptionBean){
(JacksonUtil.toJsonString(schedulerExceptionBean));
return exceptionQueue.add(schedulerExceptionBean);
public static List&JobStatisticBean& getALlJobs() {
int size = jobMap.size();
size = size&100? 100:
return Arrays.asList(jobMap.values().toArray(new JobStatisticBean[size]));
public static List&JobStatisticBean& getAllJobHistory() {
int size = jobQueue.size();
size = size&100? 100:
return Arrays.asList(jobQueue.toArray(new JobStatisticBean[size]));
public static List&SchedulerExceptionBean& getAllExceptions(){
int size = exceptionQueue.size();
size = size&100? 100:
return Arrays.asList(exceptionQueue.toArray(new SchedulerExceptionBean[size]));
private volatile boolean exit =
private ApplicationContext applicationContext =
private static volatile StatisticProcessor processorIntance =
public synchronized void init(){
if(processorIntance==null) {
(&--------------------- &+new Date().toLocaleString()+& --------------------------&);
(&--------------------- &+new Date().toLocaleString()+& --------------------------&);
(&--------------------- &+new Date().toLocaleString()+& --------------------------&);
processorIntance = new StatisticProcessor();
processorIntance.setName(GConstants.THREA_HEAD + &JobStatisticProcessor&);
processorIntance.setDaemon(true);
processorIntance.start();
public void run() {
Thread.sleep(1000*30);
synchronized (jobQueue) {
if (!jobQueue.isEmpty()) {
long outSize = jobQueue.size() - 100;
while (outSize-- & 0) {
jobQueue.poll();
synchronized (exceptionQueue) {
if (!exceptionQueue.isEmpty()) {
long outSize = exceptionQueue.size() - 100;
while (outSize-- & 0) {
exceptionQueue.poll();
}catch (Exception e){
e.printStackTrace();
}while( !this.exit);
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationC
public void afterPropertiesSet() throws Exception {
this.init();
public void destroy(){
this.exit =
public class JobStatisticBean implements Serializable {
private static long serialVersionUID = -1L;
private String
private String
private Timestamp
private Timestamp
private Long
private JobDetail
private JobExecutionContext jobExecutionC
private Job
//.. getter & setter
&?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-2.0.xsd&&
&bean id=&schedulerFactoryBean&
class=&org.springframework.scheduling.quartz.SchedulerFactoryBean&
lazy-init=&false&&
&property name=&schedulerName& value=&EZhe-taks& /&
&property name=&triggers&&
&ref bean=&task1& /&
&ref bean=&task2& /&
&/property&
&property name=&globalJobListeners& &
&bean class=&com.gozap.ezhe.task.listener.StatisticJobListener& &
&property name=&name& value=&JOB统计& /&
&/property&
&property name=&schedulerListeners&&
&bean class=&com.gozap.ezhe.task.listener.StatisticSchedulerListener&&
&/property&
&property name=&autoStartup& value=&true&/&
&property name=&configLocation& value=&classpath:quartz.properties& /&
&!--自动更新汇率任务--&
&bean id=&task1& class=&org.springframework.scheduling.quartz.CronTriggerBean&&
&property name=&jobDetail& &
&bean id=&jobUpdateCurrencyTask& class=&org.springframework.scheduling.quartz.JobDetailBean&&
&property name=&name& value=&自动更新汇率任务& /&
&property name=&jobClass& value=&com.gozap.ezhe.task.CurrencyUpdateTask&&&/property&
&/property&
&property name=&cronExpression& value=& 0 0/30 * * * ?&/&
&!--自动xx的任务--&
&bean id=&task2& class=&org.springframework.scheduling.quartz.CronTriggerBean&&
&property name=&jobDetail& &
&bean id=&logisticsScheduleTask& class=&org.springframework.scheduling.quartz.JobDetailBean&&
&property name=&name& value=&自动xx的任务& /&
&property name=&jobClass& value=&com.gozap.ezhe.task.LogisticsScheduleTask&&&/property&
&/property&
&property name=&cronExpression& value=&0 0 0/2 * * ?&/&
JobStatisticAction.java
public class JobStatisticAction extends BaseAction {
private List&JobStatisticBean& jobL
private List&JobStatisticBean& jobHistoryL
private List&SchedulerExceptionBean& jobExceptionL
public String jobStatistic() throws Exception {
jobList = StatisticProcessor.getALlJobs();
jobHistoryList = StatisticProcessor.getAllJobHistory();
Collections.reverse(jobHistoryList);
jobExceptionList = StatisticProcessor.getAllExceptions();
return Action.SUCCESS;
//============================
public List&JobStatisticBean& getJobList() {
return jobL
public List&JobStatisticBean& getJobHistoryList() {
return jobHistoryL
public List&SchedulerExceptionBean& getJobExceptionList() {
return jobExceptionL
&%@ page contentType=&text/charset=UTF-8& language=&java& %&
&%@ taglib uri=&/struts-tags& prefix=&s& %&
&%@ page import=&java.text.SimpleDateFormat& %&
&%@ page import=&java.util.Date& %&
SimpleDateFormat sdf = new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss.SSS&);
String nowTime = sdf.format(new Date());
&title&Job Statistic&/title&
&meta name=&viewport& content=&width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no&&
&!-- 新 Bootstrap 核心 CSS 文件 --&
&link rel=&stylesheet& href=&/bootstrap/3.3.4/css/bootstrap.min.css&&
&!-- 可选的Bootstrap主题文件(一般不用引入) --&
&link rel=&stylesheet& href=&/bootstrap/3.3.4/css/bootstrap-theme.min.css&&
&!-- jQuery文件。务必在bootstrap.min.js 之前引入 --&
&script src=&/jquery/1.11.2/jquery.min.js&&&/script&
&!-- 最新的 Bootstrap 核心 JavaScript 文件 --&
&script src=&/bootstrap/3.3.4/js/bootstrap.min.js&&&/script&
&&任务名称&/th&
&th style=&min-width: 180&&最近执行时间&/th&
&th style=&width: 100&&耗时(ms)&/th&
&th style=&width: 100&&More [系统时间: &font color=&red& font-size=&120%&& &%=nowTime%& &/font& ]&/th&
&s:iterator value=&jobList& id=&jobList& status=&step&&
&td&${step.index+1}&/td&
&td&${jobName}&/td&
&td&${startTime} - ${endTime}&/td&
&td&${takesTime}&/td&
&table style=&;&&错误内容&/th&
&th style=&min-width: 180&&堆栈&/th&
&s:iterator value=&jobExceptionList& id=&jobList& status=&step&&
&td&${step.index+1}&/td&
&td&${msg}&/td&
&td&${exception}&/td&
&/s:iterator&
&div class=&panel panel-info&&
&div class=&panel-heading&&
&h2 class=&text-center&&Job History&/h2&
&div class=&panel-body&&
&table class=&table-hover table&&
&th&序号&/th&
&th style=&width: 200&&任务名称&/th&
&th style=&min-width: 180&&执行时间&/th&
&th style=&width: 100&&耗时(ms)&/th&
&th style=&width: 100&&class&/th&
&s:iterator value=&jobHistoryList& id=&jobList& status=&step&&
&td&${step.index+1}&/td&
&td&${jobName}&/td&
&td&${startTime} - ${endTime}&/td&
&td&${takesTime}&/td&
&td&${jobDetail.jobClass}&/td&
&/s:iterator&
本文介绍的只是一个简单的实现,推荐使用设计模式的一些方式进行重构,如果以后有时间我也会重构
Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类 ...
spring定时任务之quartz quartzSpringBeanMySQLOracle
在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年.月.日.时和分的时间.你只能将时间通过换算成微秒后传给它.如任务是每天执行一次,则需要在spring中如下配置:
&bean id=&qu ...
spring 定时任务的 执行时间设置规则 单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpression属性.一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素.从左至右,这些元素的 ...
承接上一篇文章(spring定时任务的基本操作 简单示例): 二.spring定时任务 : 多个任务和执行时间间隔配置 1.多个任务的使用: 第一步:写好执行定时任务的类和方法(多个,参考上一篇文章) 第二步:配置配置文件:(参考上一篇文章) &bean name=&quartzScheduler& class=&org. ...
Spring 定时任务实现 1.首先配置好Spring环境,加入定时任务的配置文件,如下:&?xml version=&1.0& encoding=&GB2312&?& &!DOCTYPE beans PUBLIC &-//SPRING//DTD BEAN//EN& &h ...}

我要回帖

更多关于 springquartz执行两次 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信