<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Cron</title>
	<atom:link href="https://blog.gmem.cc/tag/cron/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Mon, 13 Apr 2026 08:03:10 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Spring与Quartz的任务调度比较</title>
		<link>https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz</link>
		<comments>https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz#comments</comments>
		<pubDate>Sat, 09 Apr 2011 06:01:14 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Cron]]></category>
		<category><![CDATA[Quartz]]></category>
		<category><![CDATA[Scheduler]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1518</guid>
		<description><![CDATA[<p>任务调度代码比较 Spring 2.x 任务调度示例 [crayon-69dedbafd1b71363052247/] Spring 3.x 任务调度示例 配置文件方式 [crayon-69dedbafd1b77391567808/] 注解方式 如果使用该方式，必须声明task:annotation-driven，如果不使用aspectj，则mode应设置为proxy。 [crayon-69dedbafd1b79507565272/] 在Service类中，使用@Scheduled来标注需要调度的方法 [crayon-69dedbafd1b7c610166372/] Quartz任务调度示例 [crayon-69dedbafd1b7e795040130/] 特性比较 比较项 Spring2.x Spring3.x Quartz <a class="read-more" href="https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz">Spring与Quartz的任务调度比较</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">任务调度代码比较</span></div>
<div class="blog_h3"><span class="graybg">Spring 2.x 任务调度示例</span></div>
<pre class="crayon-plain-tag">&lt;bean id="demoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt;
    &lt;!-- 目标Bean --&gt;
    &lt;property name="targetObject"&gt;
        &lt;bean class="cc.gmem.demo.DemoService" /&gt;
    &lt;/property&gt;
    &lt;!-- 目标方法 --&gt;
    &lt;property name="targetMethod" value="doStuff" /&gt;
    &lt;!-- 防止并发执行 --&gt;
    &lt;property name="concurrent" value="false" /&gt;
&lt;/bean&gt;
&lt;!-- 简单触发器 --&gt;
&lt;bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&gt;
    &lt;property name="jobDetail" ref="demoJob" /&gt;
    &lt;!-- 启动后，调度开始的时间 --&gt;
    &lt;property name="startDelay" value="0" /&gt;
    &lt;!-- 每隔2000ms调度一次 --&gt;
    &lt;property name="repeatInterval" value="2000" /&gt;
&lt;/bean&gt;
&lt;!-- Cron触发器 --&gt;
&lt;bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;
    &lt;property name="jobDetail" ref="demoJob" /&gt;
    &lt;property name="cronExpression" value="15 0/2 * * * ?" /&gt;
&lt;/bean&gt;
&lt;!-- 调度工厂Bean --&gt;
&lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;
    &lt;property name="triggers"&gt;
        &lt;list&gt;
            &lt;ref bean="simpleTrigger" /&gt;
            &lt;ref bean="cronTrigger" /&gt;
        &lt;/list&gt;
    &lt;/property&gt;
&lt;/bean&gt;</pre>
<div class="blog_h3"><span class="graybg">Spring 3.x 任务调度示例</span></div>
<strong>配置文件方式</strong><br />
<pre class="crayon-plain-tag">&lt;!--  任务调度器配置，pool-size为线程池大小，限制了同时最多被调度的任务 --&gt;
&lt;task:scheduler pool-size="100" id="scheduler" /&gt;
&lt;!-- 任务计划列表，支持固定频率、固定延迟、Cron表达式等 --&gt;
&lt;task:scheduled-tasks scheduler="scheduler"&gt;
    &lt;task:scheduled fixed-rate="120000" method="doStuff" ref="demoService" /&gt;
    &lt;task:scheduled cron="15 0/2 * * * ?" method="doStuff" ref="demoService" /&gt;
&lt;/task:scheduled-tasks&gt;</pre><br />
<strong>注解方式</strong><br />
如果使用该方式，必须声明task:annotation-driven，如果不使用aspectj，则mode应设置为proxy。<br />
<pre class="crayon-plain-tag">&lt;task:annotation-driven scheduler="scheduler" executor="taskExecutor" mode="aspectj" /&gt;
&lt;task:scheduler pool-size="100" id="scheduler" /</pre><br />
在Service类中，使用@Scheduled来标注需要调度的方法<br />
<pre class="crayon-plain-tag">package cc.gmem.demo;
@Component("demoService") 
public class DemoService(){
    @Scheduled(cron = "15 0/2 * * * ?")  
    public void doStuff(){

    }
}</pre>
<div class="blog_h3"><span class="graybg">Quartz任务调度示例</span></div>
<pre class="crayon-plain-tag">import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.CronScheduleBuilder.*;

StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
Properties pros = new Properties();
pros.setProperty( "org.quartz.scheduler.instanceName", "MyScheduler" );
pros.setProperty( "org.quartz.threadPool.threadCount", "10" );//调度器线程数
pros.setProperty( "org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore" );//任务存储，可以用于持久化
schedulerFactory.initialize( pros );
Scheduler scheduler = schedulerFactory.getScheduler();
//启动调度器
scheduler.start();
JobDetail job = newJob( helloWorldJob.class ).build();
//简单触发器
Trigger trigger =  newTrigger().startNow().withSchedule( simpleSchedule().withIntervalInSeconds( 1 ).repeatForever() ).build();
//Cron表达式触发器
trigger = newTrigger().startNow().withSchedule( cronSchedule( "15 0/2 * * * ?" )).build();
scheduler.scheduleJob( job, trigger );

TimeUnit.SECONDS.sleep( 1800 );
//关闭调度器
scheduler.shutdown();</pre>
<div class="blog_h2"><span class="graybg">特性比较</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 100px; text-align: center;">比较项</td>
<td style="text-align: center;">Spring2.x</td>
<td style="text-align: center;">Spring3.x</td>
<td style="text-align: center;">Quartz</td>
</tr>
</thead>
<tbody>
<tr>
<td>优缺点</td>
<td>比较繁琐，除非是老项目维护的需要，不建议使用</td>
<td>配置简单，对注解、配置文件方式的支持均较好</td>
<td>比较强大，支持任务状态的持久化</td>
</tr>
<tr>
<td>重叠执行(overlap)</td>
<td>JobDetail中设置concurrent属性可以防止重叠执行</td>
<td>默认是不允许重叠执行的，如果需要，在目标方法上添加@Async注解</td>
<td>在Job的实现类上添加：@DisallowConcurrentExecution可以防止重叠执行</td>
</tr>
</tbody>
</table>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz">Spring与Quartz的任务调度比较</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/comparision-of-spring-task-scheduler-and-quartz/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
