- 浏览: 884849 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (509)
- android (55)
- CSS (23)
- eclipse (25)
- Data Structes and Algorithms (53)
- J2SE (87)
- Java_面试学习_j2se (26)
- java_面试学习_非技术 (13)
- java_gui (2)
- java_设计模式 (27)
- JDBC (10)
- java_web (15)
- hibernate (5)
- Oracle (37)
- Struts2 (7)
- Word-----dos (24)
- Jbpm (3)
- java小技巧 (8)
- math (1)
- flex (12)
- WebService (4)
- 生活 (9)
- 小框架或小语言 (27)
- spring (1)
- 面试~~~软实力 (7)
- jstat的用法 (1)
- jmap (1)
- 数据链路层和传输层的流量控制区别 (1)
- shell (0)
- 财商 (1)
- javascript (0)
- js研究 (1)
- 代码收集 (0)
最新评论
-
海尔群:
http://jingyan.baidu.com/articl ...
android加密 -
完美天龙:
------------------------- ...
asm----字节码操纵 -
houniao1990:
大神,请问 string 类型 定义为 oracle的 cha ...
hibernate注解 -
JamesQian:
Line:103
f.doFilter(msg);
是否需 ...
责任链模式_过滤器模式 -
sacoole:
好评
interview--- 如何从N个数中选出最大(小)的n个数?
http://blog.csdn.net/bibitoo712/article/details/476253
quartz 是著名的 opensymphony 的一个项目,是一个全能型的调度系统,可以在j2ee中使用,也可以独立运行。
quartz的网站上的文档写的比较清晰明了,入门很容易,不过要使用其全部功能估计还是要费点功夫。
quartz支持插件型功能扩展,使用者可以自己编写适合的插件。
下面是一个入门的例子:
1.要求:定义两个工作,设定这两个工作的运行时间和间隔时间,这两个工作使用数据库作为持久化,运行后会发送email到指定地址。
2.quartz 的配置:
配置quartz只需要配置一个文件:quartz.properties。此文件的原型在 quartz-1.4.5/docs/config 目录下面,将example_quartz.properties拷贝到java源文件目录并改名为quartz.properties。
quartz的配置主要选项:
数据库配置:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.dataSource.myDS.driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
org.quartz.dataSource.myDS.URL = jdbc:microsoft:sqlserver://hr:1433;SelectMethod=cursor
org.quartz.dataSource.myDS.user = hradmin
org.quartz.dataSource.myDS.password = admin
org.quartz.dataSource.myDS.maxConnections = 10
这是mssql数据库的配置,其他数据库请配置适合的org.quartz.jobStore.driverDelegateClass名称。
这里配置的数据源名称为 myDS 。这唯一标志了这个数据连接。将在取得数据库连接的时候使用到。
org.quartz.plugin.jobInitializer.fileName = data/my_job_data.xml
这里指定的初始化文件名称必须具有此文件,否则quartz不能运行。这里建立了一个空文件。
quartz的数据库脚本放在 quartz-1.4.5/docs/dbTables 目录,支持常用的数据库。
3.调度主类:
主类中有俩个工作加入调度队列:SampleJob 和SecondJob
SampleJob:
SecondJob:
<bean name="statJob" class="com.alibaba.work.statistic.service.impl.StatisticServiceImpl" />
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="statJob" />
</property>
<property name="targetMethod">
<value>statDailySender</value>
</property>
</bean>
<!-- 配置触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail" />
</property>
<property name="cronExpression" value="0 * * * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
quartz 是著名的 opensymphony 的一个项目,是一个全能型的调度系统,可以在j2ee中使用,也可以独立运行。
quartz的网站上的文档写的比较清晰明了,入门很容易,不过要使用其全部功能估计还是要费点功夫。
quartz支持插件型功能扩展,使用者可以自己编写适合的插件。
下面是一个入门的例子:
1.要求:定义两个工作,设定这两个工作的运行时间和间隔时间,这两个工作使用数据库作为持久化,运行后会发送email到指定地址。
2.quartz 的配置:
配置quartz只需要配置一个文件:quartz.properties。此文件的原型在 quartz-1.4.5/docs/config 目录下面,将example_quartz.properties拷贝到java源文件目录并改名为quartz.properties。
quartz的配置主要选项:
数据库配置:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.dataSource.myDS.driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
org.quartz.dataSource.myDS.URL = jdbc:microsoft:sqlserver://hr:1433;SelectMethod=cursor
org.quartz.dataSource.myDS.user = hradmin
org.quartz.dataSource.myDS.password = admin
org.quartz.dataSource.myDS.maxConnections = 10
这是mssql数据库的配置,其他数据库请配置适合的org.quartz.jobStore.driverDelegateClass名称。
这里配置的数据源名称为 myDS 。这唯一标志了这个数据连接。将在取得数据库连接的时候使用到。
org.quartz.plugin.jobInitializer.fileName = data/my_job_data.xml
这里指定的初始化文件名称必须具有此文件,否则quartz不能运行。这里建立了一个空文件。
quartz的数据库脚本放在 quartz-1.4.5/docs/dbTables 目录,支持常用的数据库。
3.调度主类:
package com.demo.job;import java.util.Date;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.Calendar;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SimpleTrigger;import org.quartz.impl.calendar.AnnualCalendar;public class LoadJob { public static void LoadJob(SchedulerFactory sf) throws Exception { Log lg = LogFactory.getLog(LoadJob.class); lg.info("------- 初始化 -------------------"); Scheduler sched = sf.getScheduler(); lg.warn(" *** 正在删除现有的工作和触发器 ***"); String[] groups = sched.getTriggerGroupNames(); for (int i = 0; i < groups.length; i++) { String[] names = sched.getTriggerNames(groups[i]); for (int j = 0; j < names.length; j++) sched.unscheduleJob(names[j], groups[i]); } groups = sched.getJobGroupNames(); for (int i = 0; i < groups.length; i++) { String[] names = sched.getJobNames(groups[i]); for (int j = 0; j < names.length; j++) sched.deleteJob(names[j], groups[i]); } lg.info("------- 初始化完毕 -----------"); lg.info("------- 安排工作-----------"); String schedId = sched.getSchedulerInstanceId(); int count = 1; JobDetail job = new JobDetail("job_" + count, "sampleJob", SecondJob.class); SimpleTrigger trigger = new SimpleTrigger("trig_" + count, "sampleJob"); Calendar cal=null; //如果是一天一次的job cal = new AnnualCalendar(); java.util.Calendar rightNow = java.util.Calendar.getInstance(); long repeatInterval=24*60*60000; //long repeatInterval=10000; trigger = new SimpleTrigger("Trigger", Scheduler.DEFAULT_GROUP, rightNow.getTime(), null, SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval); // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar trigger.setCalendarName("sampleJob"); sched.addCalendar("sampleJob", cal, true, true); sched.scheduleJob(job, trigger); lg.info("...调度工作1.."); count++; job = new JobDetail("job_" + count, "secondjob", SampleJob.class); trigger = new SimpleTrigger("trig_" + count, "secondjob"); //如果是一天一次的job cal = new AnnualCalendar(); //rightNow = java.util.Calendar.getInstance(); Date startTime = new Date(System.currentTimeMillis() + 10000L + (count * 100)); trigger = new SimpleTrigger("TriggerContract", Scheduler.DEFAULT_GROUP, startTime, null, SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval); // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar trigger.setCalendarName("contractjob"); sched.addCalendar("contractjob", cal, true, true); sched.scheduleJob(job, trigger); lg.info("...调度工作2.."); lg.info("完成安排所有"+count+"个工作."); lg.info("------- 开始调度 ----------------"); // jobs dont start firing until start() has been called... sched.start(); lg.info("------- 调度已经开始完毕 -----------------"); lg.info("------- 调度运行中... -----------------------"); try{ Thread.sleep(80000L); }catch(Exception e){ e.printStackTrace(); } sched.shutdown(); } /** * @param args */ public static void main(String[] args) { try { boolean clearJobs = false; boolean scheduleJobs = true; for (int i = 0; i < args.length; i++) { if (args[i].equals("clearJobs")) clearJobs = true; if (args[i].equals("dontScheduleJobs")) scheduleJobs = false; } LoadJob(new org.quartz.impl.StdSchedulerFactory()); } catch (Exception e) { e.printStackTrace(); } }}
主类中有俩个工作加入调度队列:SampleJob 和SecondJob
SampleJob:
package com.demo.job; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.Calendar; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.impl.calendar.AnnualCalendar; public class LoadJob { public static void LoadJob(SchedulerFactory sf) throws Exception { Log lg = LogFactory.getLog(LoadJob.class); lg.info("------- 初始化 -------------------"); Scheduler sched = sf.getScheduler(); lg.warn(" *** 正在删除现有的工作和触发器 ***"); String[] groups = sched.getTriggerGroupNames(); for (int i = 0; i < groups.length; i++) { String[] names = sched.getTriggerNames(groups[i]); for (int j = 0; j < names.length; j++) sched.unscheduleJob(names[j], groups[i]); } groups = sched.getJobGroupNames(); for (int i = 0; i < groups.length; i++) { String[] names = sched.getJobNames(groups[i]); for (int j = 0; j < names.length; j++) sched.deleteJob(names[j], groups[i]); } lg.info("------- 初始化完毕 -----------"); lg.info("------- 安排工作-----------"); String schedId = sched.getSchedulerInstanceId(); int count = 1; JobDetail job = new JobDetail("job_" + count, "sampleJob", SecondJob.class); SimpleTrigger trigger = new SimpleTrigger("trig_" + count, "sampleJob"); Calendar cal = null; // 如果是一天一次的job cal = new AnnualCalendar(); java.util.Calendar rightNow = java.util.Calendar.getInstance(); long repeatInterval = 24 * 60 * 60000; // long repeatInterval=10000; trigger = new SimpleTrigger("Trigger", Scheduler.DEFAULT_GROUP, rightNow.getTime(), null, SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval); // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar trigger.setCalendarName("sampleJob"); sched.addCalendar("sampleJob", cal, true, true); sched.scheduleJob(job, trigger); lg.info("...调度工作1.."); count++; job = new JobDetail("job_" + count, "secondjob", SampleJob.class); trigger = new SimpleTrigger("trig_" + count, "secondjob"); // 如果是一天一次的job cal = new AnnualCalendar(); // rightNow = java.util.Calendar.getInstance(); Date startTime = new Date(System.currentTimeMillis() + 10000L + (count * 100)); trigger = new SimpleTrigger("TriggerContract", Scheduler.DEFAULT_GROUP, startTime, null, SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval); // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar trigger.setCalendarName("contractjob"); sched.addCalendar("contractjob", cal, true, true); sched.scheduleJob(job, trigger); lg.info("...调度工作2.."); lg.info("完成安排所有" + count + "个工作."); lg.info("------- 开始调度 ----------------"); // jobs dont start firing until start() has been called... sched.start(); lg.info("------- 调度已经开始完毕 -----------------"); lg.info("------- 调度运行中... -----------------------"); try { Thread.sleep(80000L); } catch (Exception e) { e.printStackTrace(); } sched.shutdown(); } /** * @param args */ public static void main(String[] args) { try { boolean clearJobs = false; boolean scheduleJobs = true; for (int i = 0; i < args.length; i++) { if (args[i].equals("clearJobs")) clearJobs = true; if (args[i].equals("dontScheduleJobs")) { scheduleJobs = false; LoadJob(new org.quartz.impl.StdSchedulerFactory()); } } } catch (Exception e) { e.printStackTrace(); } } }
SecondJob:
package com.demo.job;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Date;import java.util.GregorianCalendar;import java.util.ResourceBundle;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobPersistenceException;import org.quartz.impl.jdbcjobstore.JobStoreSupport;import org.quartz.jobs.ee.mail.SendMailJob;import org.quartz.utils.DBConnectionManager;public class SecondJob implements Job { public SecondJob() { super(); // TODO Auto-generated constructor stub } public void execute(JobExecutionContext context) throws JobExecutionException { System.err.println("--->" + context.getJobDetail().getFullName() + " executing.[" + new Date() + "]"); JobDataMap data = context.getJobDetail().getJobDataMap(); ResourceBundle bundle = ResourceBundle.getBundle("quartz"); String smtp = bundle.getString("org.qurtz.job.mail.smtp.host"); String recipient = bundle.getString("org.qurtz.job.mail.smtp.recipient"); String sender = bundle.getString("org.qurtz.job.mail.smtp.sender"); data.put(SendMailJob.PROP_SMTP_HOST,smtp); // data.put(SendMailJob.PROP_RECIPIENT,recipient); data.put(SendMailJob.PROP_SENDER,sender); int predate = 14; try { try { System.out.println("取得连接对象"); Connection con = getConnection(); //在此进行数据库操作 //.... con.close(); } catch (ClassCastException ignoree) { } } catch (Exception ignore) { ignore.printStackTrace(); } System.err.println("--- " + context.getJobDetail().getFullName() + " complete.[" + new Date() + "]"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } protected Connection getConnection() throws JobPersistenceException { try { Connection conn = DBConnectionManager.getInstance().getConnection( "myDS"); if (conn == null) { throw new SQLException( "Could not get connection from DataSource " + "myDS" + ""); } return conn; } catch (SQLException sqle) { throw new JobPersistenceException( "Failed to obtain DB connection from data source " + "myDS" + ": " + sqle.toString(), sqle); } catch (Exception e) { throw new JobPersistenceException( "Failed to obtain DB connection from data source " + "myDS" + ": " + e.toString(), e, JobPersistenceException.ERR_PERSISTENCE_CRITICAL_FAILURE); } }}
<bean name="statJob" class="com.alibaba.work.statistic.service.impl.StatisticServiceImpl" />
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="statJob" />
</property>
<property name="targetMethod">
<value>statDailySender</value>
</property>
</bean>
<!-- 配置触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail" />
</property>
<property name="cronExpression" value="0 * * * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
发表评论
-
jqplot参数描述
2012-10-17 10:20 2750jqPlot 图形报表插件简介及参数详解(jquery) ... -
Apache 代理(Proxy)
2012-08-16 17:23 1731代理分为:正向代理(Foward Proxy)和反向代理(Re ... -
Apache 2.2-SSL操作大全
2012-08-11 20:06 1594制作CSR申请文件 安装证书文件 客户端证书认证 强制H ... -
HTTP返回码中301与302的区别
2012-08-11 17:04 9358一.官方说法 301,302 ... -
handlerbar
2012-08-09 17:42 1417安装和使用 Handlebars的 ... -
win7ppt打开两个的问题
2012-08-08 10:09 19431、引言 Excel 是我们最常用的办公软件之一,在日常工作中 ... -
xsi:schemaLocation
2012-08-05 10:57 1640在实例中引用模式文档 XML Schema提供了两个在实例 ... -
sublime text 快捷键
2012-07-28 10:40 1178快捷键 XP版 Ctrl+L 选择整行 ... -
webx常用标签收集
2012-07-10 09:59 1244#set($spmHome="/static&quo ... -
java调用domino
2012-06-20 17:52 1288java访问操作lotus domino数据库 有几种方式: ... -
Lotus Domino/Notes Toolkits 综述(注:转)
2012-06-20 17:04 1624http://wind-bell.iteye.com/blog ... -
notes数据库api
2012-06-20 16:42 1879用Java远程操作Domino服务器的例子 1.服务器必 ... -
cron
2012-06-09 09:15 2691上一文中提到 Cron触发 ... -
quartz与mysql连接 持久化
2012-06-07 10:10 4516Mysql相关软件: MySQL-server-communi ... -
史上最简! Subvision SVN (svn的服务器端) 安装教程
2012-04-19 10:02 1312由于 indian 写的Subvision安装教程实在是太好了 ... -
反编译还原总结
2011-12-11 15:06 2033java class 利用jad 反编译之后,偶尔回碰到一 ... -
asm解读
2011-09-06 22:45 1188目的: 程序分析:用于分析程序,动态生成proxy等。 程序生 ... -
svn命令
2011-07-18 19:34 1439svn命令 通常都有帮助,可通过如下方式查询: $ svn ... -
maven-----概念
2011-06-28 14:32 1576常用maven命令 mvn clean install -Ds ... -
svn编程
2011-06-02 20:24 1689API文档: http://svnkit.com/jav ...
相关推荐
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...
Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息...
Quartz 是一个开源的作业调度框架,广泛应用于Java企业级应用中,用于自动化任务执行,如定时触发工作流、发送邮件、数据同步等。在Quartz的部署和配置过程中,为了存储作业和触发器的信息,我们需要在关系型数据库...
### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
**Android Studio下的Quartz工程详解** Quartz是一个开源的作业调度框架,广泛应用于Java环境中的任务调度。在Android Studio中使用Quartz,可以为应用程序添加定时执行的任务功能,例如定期发送通知、更新数据或者...
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它允许开发者灵活地定义作业和触发器,实现复杂的时间调度。在2.3.0这个版本中,Quartz 提供了针对不同数据库系统的初始化脚本,...
quartz scheduler 入门教程 Quartz Scheduler 是一种功能丰富、开源的任务调度程序库,可以在任何 Java 程序中使用。它可以用来创建简单或者复杂的执行次数可以达成千上万的任务。任务可以是任何 Java 可以做的事情...
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
Quartz.NET是一款强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。这个"Quartz.net-定时任务 Demo"示例将展示如何利用Quartz.NET来安排代码在指定时间后执行,比如几十分钟后的场景。 Quartz.NET的...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它支持持久化任务和触发器到数据库,确保即使在系统重启后也能恢复先前的任务安排。本篇将详细介绍Quartz如何实现数据库持久化,并...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。Quartz 2.2.2 版本是其在特定时间的一个稳定版本,它提供了丰富的功能来帮助开发者创建、安排和管理任务。在描述中提到的"数据库...
Quartz是一款开源的作业调度框架,它允许开发者创建、调度和执行各种类型的任务。这个"quartz动态任务管理"源码包很可能是针对Quartz框架的实现,旨在帮助开发者更方便地管理和控制任务的生命周期。 Quartz的核心...
Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 将任务定义为标准...
前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...
Quartz.NET 是一个开源的作业调度框架,它允许开发者在.NET环境中定义和执行定时任务。这个框架的强大之处在于它的灵活性和可扩展性,使得开发者能够创建复杂的调度逻辑,以满足各种自动化需求。以下是对Quartz.NET...
Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。在Java应用开发中,Quartz常被用来自动化各种后台任务,如数据清理、报告生成等。"Quartz所需jar包"是使用Quartz库进行...
SpringQuartz是一个强大的任务调度框架,它在Java应用程序中用于自动化执行特定任务,如定时生成文件、统计数据或执行后台清理工作。Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时...
在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...