﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-无线&amp;移动互联网-文章分类-SSH2 --Spring</title><link>http://www.blogjava.net/jzone/category/45119.html</link><description>从业互联网、期盼物联网·· 不断的努力、追求，等待时机，相信该来的终究是会来的</description><language>zh-cn</language><lastBuildDate>Sun, 14 Nov 2010 02:15:58 GMT</lastBuildDate><pubDate>Sun, 14 Nov 2010 02:15:58 GMT</pubDate><ttl>60</ttl><item><title>Quartz cron 表达式格式的含义</title><link>http://www.blogjava.net/jzone/articles/332991.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 26 Sep 2010 12:27:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/332991.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/332991.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/332991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/332991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/332991.html</trackback:ping><description><![CDATA[<p><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">摘自:unmi翻译的《Quartz Job Scheduling Framework 中文版 V0.9.5.chm》一书</span></span></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt; font-family: 微软雅黑">Unmi&#8217;s blog</span><span style="font-size: 12pt; font-family: 微软雅黑">：<a href="http://unmi.cc/">http://unmi.cc</a> </span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">Quartz cron </span></span></span></span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">表达式的格式十分类似于 UNIX cron 格式，但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划，而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如，每45秒)，因此这是一个非常好的差异。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">在 UNIX cron 里，要执行的作业（或者说命令）是存放在 cron 表达式中的，在第六个域位置上。Quartz 用 cron 表达式存放执行计划。引用了 cron 表达式的 <span style="color: purple">CronTrigger</span>在计划的时间里会与 job 关联上。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">另一个与 UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(<span style="color: purple">分、时、日、月和周</span>)，Quartz 提供七个域。表 5.1 列出了 Quartz cron 表达式支持的七个域。</span></span></span></span></p>
<p>
<table style="border-right: windowtext 1pt dashed; border-top: windowtext 1pt dashed; border-left: windowtext 1pt dashed; width: 487.5pt; border-bottom: windowtext 1pt dashed" cellpadding="0" width="650" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">名称</span></span></span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是否必须</span></span></span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">允许值</span></span></span></span></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">特殊字符</span></span></span></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">秒</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">0-59</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * /</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">分</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">0-59</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * /</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">时</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">0-23</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * /</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">日</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">1-31</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * ? / L W C</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">月</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt; font-family: 微软雅黑">1-12 </span><span style="font-size: 12pt; font-family: 微软雅黑">或 JAN-DEC</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * /</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">周</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">是</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt; font-family: 微软雅黑">1-7 </span><span style="font-size: 12pt; font-family: 微软雅黑">或 SUN-SAT</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * ? / L C #</span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">年</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">否</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">空 或 1970-2099</span></span></span></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 0.75pt; border-top: windowtext 1pt solid; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: windowtext 1pt solid; padding-top: 0.75pt; border-bottom: windowtext 1pt solid">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; color: purple; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">, - * /</span></span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">月份和星期的名称是不区分大小写的。<span style="color: purple">FRI</span>和 <span style="color: purple">fri</span>是一样的。<br />
域之间有空格分隔，这和 UNIX cron 一样。无可争辩的，我们能写的最简单的表达式看起来就是这个了：<br />
</span></span></span><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">* * * ? * *<br />
</span>这个表达会每秒钟(每分种的、每小时的、每天的)激发一个部署的 job。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&#183;</span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">理解特殊字符</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">同 UNIX cron 一样，Quartz cron 表达式支持用特殊字符来创建更为复杂的执行计划。然而，Quartz 在特殊字符的支持上比标准 UNIX cron 表达式更丰富了。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="color: purple"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">* </span></span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">星号</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">使用星号(*) 指示着你想在这个域上包含所有合法的值。例如，在月份域上使用星号意味着每个月都会触发这个 trigger。<br />
表达式样例：<span style="color: purple">0 * 17 * * ?</span><br />
意义：每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值 17 在小时域上，在下午 6 点时，小时变为 18 了，也就不再理会这个 trigger，直到下一天的下午5点。<br />
在你希望 trigger 在该域的所有有效值上被激发时使用 <span style="color: purple">*</span>字符。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="color: purple"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">? </span></span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">问号</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">?</span> </span></span></span></span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">号只能用在<span style="color: purple">日</span>和<span style="color: purple">周域</span>上，但是不能在这两个域上同时使用。你可以认为 <span style="color: purple">?</span>字符是 "我并不关心在该域上是什么值。" 这不同于星号，星号是指示着该域上的每一个值。? 是说不为该域指定值。<br />
不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上，假定同时指定值的话，意义就会变得含混不清了：考虑一下，如果一个表达式在<span style="color: purple">日</span>域上有值11，同时在<span style="color: purple">周</span>域上指定了 <span style="color: purple">WED</span>。那么是要 trigger 仅在每个月的11号，且正好又是星期三那天被激发？还是在每个星期三的11号被激发呢？要去除这种不明确性的办法就是不能同时在这两个域上指定值。<br />
只要记住，假如你为这两域的其中一个指定了值，那就必须在另一个字值上放一个 <span style="color: purple">?</span>。<br />
表达式样例：<span style="color: purple">0 10,44 14 ? 3 WEB</span><br />
意义：在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">,</span> </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">逗号</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">逗号 (<span style="color: purple">,) </span>是用来在给某个域上指定一个值列表的。例如，使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。<br />
表达式样例：<span style="color: purple">0 0,15,30,45 * * * ?</span><br />
意义：每刻钟触发一次 trigger。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">/</span> </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">斜杠</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">斜杠 (<span style="color: purple">/) </span>是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增，但是我们也能写成这样 <span style="color: purple">0/15</span>。<br />
表达式样例：<span style="color: purple">0/15 0/30 * * * ?</span><br />
意义：在整点和半点时每15秒触发 trigger。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">- </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">中划线</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
</span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">中划线 (<span style="color: purple">-) </span>用于指定一个范围。例如，在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。"&nbsp; 域的值不允许回卷，所以像 50-10 这样的值是不允许的。<br />
表达式样例：<span style="color: purple">0 45 3-8 ? * *</span><br />
意义：在上午的3点至上午的8点的45分时触发 trigger。</span></span></span></span></p>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">L</span> </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">字母</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">L</span> </span></span></span></span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">说明了某域上允许的最后一个值。它仅被<span style="color: purple">日</span>和<span style="color: purple">周</span>域支持。当用在日域上，表示的是在<span style="color: purple">月</span>域上指定的月份的最后一天。例如，当月域上指定了 <span style="color: purple">JAN</span>时，在<span style="color: purple">日</span>域上的 <span style="color: purple">L</span>会促使 trigger 在1月31号被触发。假如<span style="color: purple">月</span>域上是 <span style="color: purple">SEP</span>，那么 L 会预示着在9月30号触发。换句话说，就是不管指定了哪个月，都是在相应月份的时最后一天触发 trigger。<br />
表达式 <span style="color: purple">0 0 8 L * ?</span>意义是在每个月最后一天的上午 8:00 触发 trigger。在<span style="color: purple">月</span>域上的 * 说明是 "每个月"。<br />
当 <span style="color: purple">L</span>字母用于周域上，指示着周的最后一天，就是星期六 (或者数字7)。所以如果你需要在每个月的最后一个星期六下午的 11:59 触发 trigger，你可以用这样的表达式 <span style="color: purple">0 59 23 ? * L</span>。<br />
当使用于<span style="color: purple">周</span>域上，你可以用一个数字与 <span style="color: purple">L</span>连起来表示月份的最后一个星期 X。例如，表达式 <span style="color: purple">0 0 12 ? * 2L</span>说的是在每个月的最后一个星期一触发 trigger。</span></span></span></span></p>
<div align="center">
<table style="width: 70%" cellpadding="0" width="70%" border="0">
    <tbody>
        <tr>
            <td style="border-right: 1pt inset; padding-right: 0.75pt; border-top: 1pt inset; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: 1pt inset; padding-top: 0.75pt; border-bottom: 1pt inset">
            <p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">不要让范围和列表值与 L 连用</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
            <br />
            </span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">虽然你能用星期数(<span style="color: purple">1-7)</span>与 L 连用，但是不允许你用一个范围值和列表值与 L 连用。这会产生不可预知的结果。</span></span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">W</span> </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">字母</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">W</span> </span></span></span></span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">字符代表着平日 (<span style="color: purple">Mon-Fri)</span>，并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的，所以 W 字符可能是非常重要的。例如，日域中的 <span style="color: purple">15W</span>意味着 "离该月15号的最近一个平日。" 假如15号是星期六，那么 trigger 会在14号(星期四)触发，因为距15号最近的是星期一，这个例子中也会是17号<span style="color: blue">（译者Unmi注：不会在17号触发的，如果是</span><span style="color: purple">15W</span><span style="color: blue">，可能会是在14号(15号是星期六)或者15号(15号是星期天)触发，也就是只能出现在邻近的一天，如果15号当天为平日直接就会当日执行）</span>。<span style="color: purple">W</span>只能用在指定的<span style="color: purple">日</span>域为单天，不能是范围或列表值。</span></span></span></span></p>
<p><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<strong><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">#</span> </span></span></span></strong></span><strong><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">井号</span></span></span></span></strong><span style="font-size: 12pt; font-family: 微软雅黑"><br />
<span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="color: purple">#</span> </span></span></span></span><span style="font-size: 12pt; font-family: 微软雅黑"><span style="font-size: 14pt"><span style="font-size: 12pt"><span style="font-size: 10pt">字符仅能用于<span style="color: purple">周</span>域中。它用于指定月份中的第几周的哪一天。例如，如果你指定周域的值为 <span style="color: purple">6#3</span>，它意思是某月的第三个周五 (<span style="color: purple">6=</span>星期五，<span style="color: purple">#3</span>意味着月份中的第三周)。另一个例子 <span style="color: purple">2#1</span>意思是某月的第一个星期一 (<span style="color: purple">2=</span>星期一，<span style="color: purple">#1</span>意味着月份中的第一周)。注意，假如你指定 <span style="color: purple">#5</span>，然而月份中没有第 5 周，那么该月不会触发。</span></span></span></span></p>
 <img src ="http://www.blogjava.net/jzone/aggbug/332991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-09-26 20:27 <a href="http://www.blogjava.net/jzone/articles/332991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP详细导读-用多手段实例对比呈现AOP</title><link>http://www.blogjava.net/jzone/articles/322397.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 31 May 2010 17:24:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322397.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/322397.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/322397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/322397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/322397.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AOP面向切面编程（最突出的是处理权限控制,在本文中，主要介绍日志处理）：一、由无组件实现AOP引出Spring AOP：1．&nbsp;使用JDK中的Proxy技术实现AOP功能package&nbsp;cn.itcast.aop;import&nbsp;java.lang.reflect.InvocationHandler;import&nbsp;java.lang...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/322397.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/322397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-06-01 01:24 <a href="http://www.blogjava.net/jzone/articles/322397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 与 Spring 集成使用的实例</title><link>http://www.blogjava.net/jzone/articles/322097.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 27 May 2010 17:13:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322097.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/322097.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/322097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/322097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/322097.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前面文章中，有举出不集成但用Quartz的应用，这里，我们通过Spring 的IOC来与Quartz集成使用，对于定时任务，我们可以让这个应用做为jar 小工具在linux下跑，也可以将应用单独放在一个容器里跑。这个视情况而定一下是一个简单的应用，quartz + Spring 集成使用的核心就这Spring的配置文件中了&lt;?xml&nbsp;version="1.0"&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/322097.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/322097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-28 01:13 <a href="http://www.blogjava.net/jzone/articles/322097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Quartz 任务调度存储信息（三）</title><link>http://www.blogjava.net/jzone/articles/322021.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 27 May 2010 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322021.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/322021.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/322021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/322021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/322021.html</trackback:ping><description><![CDATA[<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">任务调度信息存储</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在默认情况下</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">将任务调度的运行信息保存在内存中，这种方法提供了最佳的性能，因为内存中数据访问最快。不足之处是缺乏数据的持久性，当程序路途停止或系统崩溃时，所有运行的信息都会丢失。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">比如我们希望安排一个执行</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">100</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">次的任务，如果执行到</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">50</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">次时系统崩溃了，系统重启时任务的执行计数器将从</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">0</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">开始。在大多数实际的应用中，我们往往并不需要保存任务调度的现场数据，因为很少需要规划一个指定执行次数的任务。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">对于仅执行一次的任务来说，其执行条件信息本身应该是已经持久化的业务数据（如锁定到期解锁任务，解锁的时间应该是业务数据），当执行完成后，条件信息也会相应改变。当然调度现场信息不仅仅是记录运行次数，还包括调度规则、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的数据等等。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">如果确实需要持久化任务调度信息，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">允许你通过调整其属性文件，将这些信息保存到数据库中。使用数据库保存任务调度信息后，即使系统崩溃后重新启动，任务的调度信息将得到恢复。如前面所说的例子，执行</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">50</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">次崩溃后重新运行，计数器将从</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">51</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">开始计数。使用了数据库保存信息的任务称为持久化任务。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">通过配置文件调整任务调度信息的保存策略</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">其实</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz JAR</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">文件的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">包下就包含了一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">quartz.properties</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">属性配置文件并提供了默认设置。如果需要调整默认配置，可以在类路径下建立一个新的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">quartz.properties</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，它将自动被</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">加载并覆盖默认的设置。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">先来了解一下</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的默认属性配置文件：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">5 quartz.properties</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：默认配置</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">①</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">集群的配置，这里不使用集群</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.scheduler.instanceName = DefaultQuartzScheduler</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.scheduler.rmi.export = false</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.scheduler.rmi.proxy = false</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.scheduler.wrapJobExecutionInUserTransaction = false</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">②</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">配置调度器的线程池</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.threadPool.threadCount = 10</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.threadPool.threadPriority = 5</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">③</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">配置任务调度现场数据保存机制</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.jobStore.class = <strong>org.quartz.simpl.RAMJobStore</strong></span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的属性配置文件主要包括三方面的信息：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">1)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">集群信息；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">调度器线程池；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">3)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">任务调度现场数据的保存。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">如果任务数目很大时，可以通过增大线程池的大小得到更好的性能。默认情况下，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">采用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.simpl.RAMJobStore</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">保存任务的现场数据，顾名思义，信息保存在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">RAM</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">内存中，我们可以通过以下设置将任务调度现场数据保存到数据库中：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><a name="_Ref161637439"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">代码清单</span></a><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">6 quartz.properties</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：使用数据库保存任务调度现场数据</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&#8230;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.jobStore.tablePrefix = QRTZ_<strong>①</strong></span><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">数据表前缀</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.jobStore.dataSource = qzDS<strong>②</strong></span><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">数据源名称</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">③</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">定义数据源的具体属性</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.dataSource.qzDS.driver = oracle.jdbc.driver.OracleDriver</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.dataSource.qzDS.URL = jdbc:oracle:thin:@localhost:1521:ora9i</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.dataSource.qzDS.user = stamen</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.dataSource.qzDS.password = abc</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.dataSource.qzDS.maxConnections = 10</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">要将任务调度数据保存到数据库中，就必须使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.impl.jdbcjobstore.JobStoreTX</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">代替原来的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.simpl.RAMJobStore</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">并提供相应的数据库配置信息。首先</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">①</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">处指定了</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">数据库表的前缀，在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">②</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">处定义了一个数据源，在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">③</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">处具体定义这个数据源的连接信息。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">你必须事先在相应的数据库中创建</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的数据表（共</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">8</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">张），在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的完整发布包的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">docs/dbTables</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">目录下拥有对应不同数据库的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SQL</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">脚本。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">查询数据库中的运行信息</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">任务的现场保存对于上层的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">程序来说是完全透明的，我们在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">src</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">目录下编写一个如代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">6</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">所示的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">quartz.properties</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">文件后，重新运行代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">或代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的程序，在数据库表中将可以看到对应的持久化信息。当调度程序运行过程中途停止后，任务调度的现场数据将记录在数据表中，在系统重启时就可以在此基础上继续进行任务的调度。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><a name="_Ref161644355"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">代码清单</span></a><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">7 JDBCJobStoreRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：从数据库中恢复任务的调度</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体"></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">package com.baobaotao.basic.quartz;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">import org.quartz.Scheduler;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">import org.quartz.SchedulerFactory;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">import org.quartz.SimpleTrigger;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">import org.quartz.Trigger;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">import org.quartz.impl.StdSchedulerFactory;</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">public class JDBCJobStoreRunner {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SchedulerFactory schedulerFactory = new StdSchedulerFactory();</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scheduler scheduler = schedulerFactory.getScheduler();</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">①获取调度器中所有的触发器组</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] triggerGroups = scheduler.getTriggerGroupNames();</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">②重新恢复在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">tgroup1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">组中，名为</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">trigger1_1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">触发器的运行</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; triggerGroups.length; i++) {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] triggers = scheduler.getTriggerNames(triggerGroups[i]);</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; triggers.length; j++) {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Trigger tg = scheduler.getTrigger(triggers[j],&nbsp;&nbsp; triggerGroups[i]);</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">②</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">-1:</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">根据名称判断</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tg instanceof SimpleTrigger&amp;&amp; tg.getFullName().equals("tgroup1.trigger1_1")) {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">②</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">-1:</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">恢复运行</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.rescheduleJob(triggers[j], triggerGroups[i],&nbsp;tg);</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler.start();</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">}</span></p>
<p style="line-height: 150%; text-align: left" align="left"><br />
当代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTriggerRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">执行到一段时间后非正常退出，我们就可以通过这个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JDBCJobStoreRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">根据记录在数据库中的现场数据恢复任务的调度。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的所有</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">以及</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的运行信息都会保存在数据库中，这里我们仅恢复</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">tgroup1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">组中名称为</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">trigger1_1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的触发器，这可以通过如</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">②-1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">所示的代码进行过滤，触发器的采用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">GROUP.TRIGGER_NAME</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的全名格式。通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler#rescheduleJob(String triggerName,String groupName,Trigger newTrigger)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">即可重新调度关联某个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的任务。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">下面我们来观察一下不同时期</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">qrtz_simple_triggers</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表的数据：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">．运行代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTriggerRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">一小段时间后退出：<br />
</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'"><img height="31" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/20100527/quartzStore1.jpg" width="598" border="0" /><br />
REPEAT_COUNT</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表示需要运行的总次数，而</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">TIMES_TRIGGER</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表示已经运行的次数。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">．运行代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">7</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JDBCJobStoreRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">恢复</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">trigger1_1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的触发器，运行一段时间后退出，这时</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">qrtz_simple_triggers</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的数据如下：<br />
</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体"><img height="31" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/20100527/quartzStore2.jpg" width="598" border="0" /><br />
首先</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">会将原</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">REPEAT_COUNT-TIMES_TRIGGER</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">得到新的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">REPEAT_COUNT</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">值，并记录已经运行的次数（重新从</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">0</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">开始计算）。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">．重新启动</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JDBCJobStoreRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">运行后，数据又将发生相应的变化：<br />
</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'"><img height="32" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/20100527/quartzStore3.jpg" width="598" border="0" /><br />
4</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">．继续运行直至完成所有剩余的次数，再次查询</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">qrtz_simple_triggers</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表：<br />
</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体"><img height="34" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/20100527/quartzStore4.jpg" width="598" border="0" /><br />
这时，该表中的记录已经变空。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">值得注意的是，如果你使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JDBC</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">保存任务调度数据时，当你运行代码清单</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTriggerRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">然后退出，当再次希望运行</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTriggerRunner</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">时，系统将抛出</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">重名的异常：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Unable to store Job with name: 'job1_1' and group: 'jGroup1', because one already exists with this identification.</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">因为每次调用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler#scheduleJob()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">时，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">都会将</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的信息保存到数据库中，如果数据表中已经同名的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">或</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，异常就产生了。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">本文使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">quartz 1.6</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">版本，我们发现当后台数据库使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">MySql</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">时，数据保存不成功，该错误是</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Bug</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，相信会在高版本中得到修复。因为</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">HSQLDB</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">不支持</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SELECT * FROM TABLE_NAME FOR UPDATE</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的语法，所以不能使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">HSQLDB</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">数据库。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">小结</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">提供了最为丰富的任务调度功能，不但可以制定周期性运行的任务调度方案，还可以让你按照日历相关的方式进行任务调度。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">框架的重要组件包括</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">以及辅助性的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">拥有一个线程池，通过线程池为任务提供执行线程，你可以通过配置文件对线程池进行参数定制。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的另一个重要功能是可将任务调度信息持久化到数据库中，以便系统重启时能够恢复已经安排的任务。此外，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">还拥有完善的事件体系，允许你注册各种事件的监听器。</span></p>
<img src ="http://www.blogjava.net/jzone/aggbug/322021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-27 13:49 <a href="http://www.blogjava.net/jzone/articles/322021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Quartz Trigger 和表达式（二）</title><link>http://www.blogjava.net/jzone/articles/322018.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 27 May 2010 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322018.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/322018.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/322018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/322018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/322018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;使用SimpleTriggerSimpleTrigger拥有多个重载的构造函数，用以在不同场合下构造出对应的实例：●SimpleTrigger(String name, String group)：通过该构造函数指定Trigger所属组和名称；●SimpleTrigger(String name, String group, Date startTime)：除指定Tri...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/322018.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/322018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-27 13:41 <a href="http://www.blogjava.net/jzone/articles/322018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Quartz 框架结构概述（一）</title><link>http://www.blogjava.net/jzone/articles/322015.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 27 May 2010 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322015.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/322015.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/322015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/322015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/322015.html</trackback:ping><description><![CDATA[<strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">概述</span></strong>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">各种企业应用几乎都会碰到任务调度的需求，就拿论坛来说：每隔半个小时生成精华文章的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">RSS</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">文件，每天凌晨统计论坛用户的积分排名，每隔</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">30</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">分钟执行锁定用户解锁任务。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">对于一个典型的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">MIS</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">系统来说，在每月</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">号凌晨统计上个月各部门的业务数据生成月报表，每半个小时查询用户是否已经有快到期的待处理业务</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">&#8230;&#8230;</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，这样的例子俯拾皆是，不胜枚举。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">任务调度本身涉及到多线程并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。如果直接使用自定义线程这种刀耕火种的原始办法，开发任务调度程序是一项颇具挑战性的工作。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Java</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">开源的好处就是：领域问题都能找到现成的解决方案。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">OpenSymphony</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">所提供的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">自</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">2001</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">年发布版本以来已经被众多项目作为任务调度的解决方案，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在提供巨大灵活性的同时并未牺牲其简单性，它所提供的强大功能使你可以应付绝大多数的调度需求。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在开源任务调度框架中的翘首，它提供了强大任务调度机制，难能可贵的是它同时保持了使用的简单性。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz </span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">允许开发人员灵活地定义触发器的调度时间表，并可以对触发器和任务进行关联映射。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">此外，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">提供了调度运行环境的持久化机制，可以保存并恢复调度现场，即使系统因故障关闭，任务调度现场数据并不会丢失。此外，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">还提供了组件式的侦听器、各种插件、线程池等功能。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">了解</span></strong><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span></strong><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">体系结构</span></strong></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">对任务调度的领域问题进行了高度的抽象，提出了调度器、任务和触发器这</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">个核心的概念，并在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">通过接口和类对重要的这些核心概念进行描述：</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：是一个接口，只有一个方法</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">void execute(JobExecutionContext context)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，开发者实现该接口定义运行任务，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobExecutionContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">类提供了调度上下文的各种信息。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">运行时的信息保存在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实例中；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在每次执行</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">时，都重新创建一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实例，所以它不直接接受一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的实例，相反它接收一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实现类，以便运行时通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">newInstance()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的反射机制实例化</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。因此需要通过一个类来描述</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的实现类及其它相关的静态信息，如</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">名字、描述、关联监听器等信息，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">承担了这一角色。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">通过该类的构造函数可以更具体地了解它的功用：</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass)</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，该构造函数要求指定</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的实现类，以及任务在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的组名和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">名称；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：是一个类，描述触发</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">执行的时间触发规则。主要有</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTrigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">CronTrigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">这两个子类。当仅需触发一次或者以固定时间间隔周期执行，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SimpleTrigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">是最适合的选择；而</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">CronTrigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">则可以通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Cron</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表达式定义出各种复杂时间规则的调度方案：如每早晨</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">9:00</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">执行，周一、周三、周五下午</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">5:00</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">执行等；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">java.util.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">不同，它是一些日历特定时间点的集合（可以简单地将</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">看作</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">java.util.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的集合</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">——java.util.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">代表一个日历时间点，无特殊说明后面的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">即指</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">）。一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以和多个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">关联，以便排除或包含某些时间点。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">假设，我们安排每周星期一早上</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">10:00</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">执行任务，但是如果碰到法定的节日，任务则不执行，这时就需要在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">触发机制的基础上使用</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">进行定点排除。针对不同时间段类型，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">org.quartz.impl.calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">包下提供了若干个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Calendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的实现类，如</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">AnnualCalendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">MonthlyCalendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">WeeklyCalendar</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">分别针对每年、每月和每周进行定义；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：代表一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的独立运行容器，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以注册到</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中，两者在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中拥有各自的组及名称，组及名称是</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">查找定位容器中某一对象的依据，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的组及名称必须唯一，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的组和名称也必须唯一（但可以和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的组和名称相同，因为它们是不同类型的）。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">定义了多个接口方法，允许外部通过组及名称访问和控制容器中</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以将</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">绑定到某一</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中，这样当</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">触发时，对应的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">就被执行。一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以对应多个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，但一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">只能对应一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。可以通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerFactory</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">创建一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实例。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">拥有一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，它类似于</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">ServletContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，保存着</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">上下文信息，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">都可以访问</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">内的信息。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">内部通过一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Map</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，以键值对的方式维护这些上下文数据，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">为保存和获取数据提供了多个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">put()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">getXxx()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的方法。可以通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler# getContext()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">获取对应的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实例；</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">●ThreadPool</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">：</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">使用一个线程池作为任务运行的基础设施，任务通过共享线程池中的线程提高运行效率。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">有一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">StatefulJob</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">子接口，代表有状态的任务，该接口是一个没有方法的标签接口，其目的是让</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">知道任务的类型，以便采用不同的执行方案。无状态任务在执行时拥有自己的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">拷贝，对</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的更改不会影响下次的执行。而有状态任务共享共享同一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">实例，每次任务执行对</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">所做的更改会保存下来，后面的执行可以看到这个更改，也即每次执行任务后都会对后面的执行发生影响。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">正因为这个原因，无状态的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以并发执行，而有状态的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">StatefulJob</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">不能并发执行，这意味着如果前次的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">StatefulJob</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">还没有执行完毕，下一次的任务将阻塞等待，直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素，程序往往拥有更高的复杂度，因此除非必要，应该尽量使用无状态的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">如果</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">使用了数据库持久化任务调度信息，无状态的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">仅会在</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">注册任务时保持一次，而有状态任务对应的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">在每次执行任务后都会进行保存。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">自身也可以拥有一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，其关联的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Job</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以通过</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobExecutionContext#getTrigger().getJobDataMap()</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">获取</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。不管是有状态还是无状态的任务，在任务执行期间对</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">所做的更改都不会进行持久，也即不会对下次的执行产生影响。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">拥有完善的事件和监听体系，大部分组件都拥有事件，如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等等，可以注册相应的监听器处理感兴趣的事件。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">图</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">描述了</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的内部组件结构，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">SchedulerContext</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">提供</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">全局可见的上下文信息，每一个任务都对应一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">，虚线表达的</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDataMap</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">表示对应有状态的任务：<br />
</span></p>
<p style="line-height: 150%; text-align: left" align="left"><a name="_Ref161569688"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体"><img height="226" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/20100527/quartzScheduler.jpg" width="459" border="0" /><br />
图</span></a><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">1 Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">结构图</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">一个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">可以拥有多个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Triger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">组和多个</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">组，注册</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Trigger</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">JobDetail</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">时，如果不显式指定所属的组，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">将放入到默认组中，默认组的组名为</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler.DEFAULT_GROUP</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">。组名和名称组成了对象的全名，同一类型对象的全名不能相同。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">本身就是一个容器，它维护着</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">的各种组件并实施调度的规则。</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Scheduler</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">还拥有一个线程池，线程池为任务提供执行线程</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">——</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">这比执行任务时简单地创建一个新线程要拥有更高的效率，同时通过共享节约资源的占用。通过线程池组件的支持，对于繁忙度高、压力大的任务调度，</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">将可以提供良好的伸缩性。</span></p>
<p style="line-height: 150%; text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">提示：</span></strong><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'"> Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">完整下载包</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">examples</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">目录下拥有</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">10</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">多个实例，它们是快速掌握</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 'Courier New'">Quartz</span><span style="font-size: 10pt; color: black; line-height: 150%; font-family: 宋体">应用很好的实例。</span></p>
 <img src ="http://www.blogjava.net/jzone/aggbug/322015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-27 12:59 <a href="http://www.blogjava.net/jzone/articles/322015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring IOC/DI/注解-理论与实例并存</title><link>http://www.blogjava.net/jzone/articles/321967.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 26 May 2010 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321967.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/321967.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/321967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/321967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/321967.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、定义：Spring 是一个开源的控制反转（Inversion of Control,IoC/DI）和面向切面（AOP)的容器框架，它的主要目的是简化企业开发二、实例化Spring容器：&nbsp;&nbsp;&nbsp; 方法一:在类路径下寻找配置文件来实例化容器ApplicationContext ctx = new ClassPathXmlApplicationContex...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/321967.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/321967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-27 00:04 <a href="http://www.blogjava.net/jzone/articles/321967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 组件式的任务调度---Quartz</title><link>http://www.blogjava.net/jzone/articles/305823.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 13 Dec 2009 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/305823.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/305823.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/305823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/305823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/305823.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 参考：http://www.blogjava.net/steady/archive/2007/08/02/134017.html Quartz 是一个强大的企业级 Schedule 工具，也是目前最好的开源 Schedule 工具。Spring中也集成了quartz的应用Job：org.quartz.Job是一个接口，只定义了void execute(JobExecutionConte...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/305823.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/305823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-13 23:29 <a href="http://www.blogjava.net/jzone/articles/305823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在java中利用JDK自带的TimerTask实现定时任务</title><link>http://www.blogjava.net/jzone/articles/305819.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 13 Dec 2009 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/305819.html</guid><wfw:comment>http://www.blogjava.net/jzone/comments/305819.html</wfw:comment><comments>http://www.blogjava.net/jzone/articles/305819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzone/comments/commentRss/305819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzone/services/trackbacks/305819.html</trackback:ping><description><![CDATA[<p>　　在web方式下，如果我们要实现定期执行某些任务的话，除了用quartz等第三方开源工具外，我们可以使用Timer和TimeTask来完成指定的定时任务。专业的开源工具可参考Quartz：<a href="http://www.opensymphony.com/quartz/" target="_blank">http://www.opensymphony.com/quartz/</a><br />
<br />
<strong>第一步：创建一个任务具体操作类，实现ServletContextListener 接口 MyListener.java</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;yixun.wap.tools;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Timer;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.ServletContextEvent;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.ServletContextListener;<br />
<img id="Codehighlighter1_195_464_Open_Image" onclick="this.style.display='none'; Codehighlighter1_195_464_Open_Text.style.display='none'; Codehighlighter1_195_464_Closed_Image.style.display='inline'; Codehighlighter1_195_464_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_195_464_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_195_464_Closed_Text.style.display='none'; Codehighlighter1_195_464_Open_Image.style.display='inline'; Codehighlighter1_195_464_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyListener&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletContextListener&nbsp;</span><span id="Codehighlighter1_195_464_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_195_464_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Timer&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_285_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_285_380_Open_Text.style.display='none'; Codehighlighter1_285_380_Closed_Image.style.display='inline'; Codehighlighter1_285_380_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_285_380_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_285_380_Closed_Text.style.display='none'; Codehighlighter1_285_380_Open_Image.style.display='inline'; Codehighlighter1_285_380_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;</span><span id="Codehighlighter1_285_380_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_285_380_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer(</span><span style="color: #0000ff">true</span><span style="color: #000000">);//true 指定为后台线程<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置任务计划，启动和间隔时间</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.schedule(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyTask(),&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">86400000</span><span style="color: #000000">);<br />
//可写多个定时任务<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_440_461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_440_461_Open_Text.style.display='none'; Codehighlighter1_440_461_Closed_Image.style.display='inline'; Codehighlighter1_440_461_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_440_461_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_440_461_Closed_Text.style.display='none'; Codehighlighter1_440_461_Open_Image.style.display='inline'; Codehighlighter1_440_461_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;</span><span id="Codehighlighter1_440_461_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_440_461_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.cancel();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
还有好几种任务调度<br />
timer.schedule(task, time);&nbsp;&nbsp;&nbsp; <br />
// time为Date类型：在指定时间执行一次。&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
timer.schedule(task, firstTime, period);&nbsp;&nbsp;&nbsp; <br />
// firstTime为Date类型,period为long&nbsp;&nbsp;&nbsp; <br />
// 从firstTime时刻开始，每隔period毫秒执行一次。&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
timer.schedule(task, delay)&nbsp;&nbsp;&nbsp; <br />
// delay 为long类型：从现在起过delay毫秒执行一次&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
timer.schedule(task, delay, period)&nbsp;&nbsp;&nbsp; <br />
// delay为long,period为long：从现在起过delay毫秒以后，每隔period&nbsp;&nbsp;&nbsp; <br />
// 毫秒执行一次。 <br />
<p><strong><br />
第二步：创建一个时间任务类 MyTask.java</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;yixun.wap.tools;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.TimerTask;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_93_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_200_Open_Text.style.display='none'; Codehighlighter1_93_200_Closed_Image.style.display='inline'; Codehighlighter1_93_200_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_93_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_93_200_Closed_Text.style.display='none'; Codehighlighter1_93_200_Open_Image.style.display='inline'; Codehighlighter1_93_200_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyTask&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TimerTask&nbsp;</span><span id="Codehighlighter1_93_200_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_93_200_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_116_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_197_Open_Text.style.display='none'; Codehighlighter1_116_197_Closed_Image.style.display='inline'; Codehighlighter1_116_197_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_116_197_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_116_197_Closed_Text.style.display='none'; Codehighlighter1_116_197_Open_Image.style.display='inline'; Codehighlighter1_116_197_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_116_197_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_116_197_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println("call&nbsp;at&nbsp;"&nbsp;+&nbsp;(new&nbsp;Date()));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;此处添加具体任务代码</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><strong>第三步：在web.xml中添加一个监听器</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yixun.wap.tools.MyListener<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">要定期执行的任务</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
通过配置监听器，那么在web服务器启动的时候,任务也被启动,并且会周期性的执行<br />
参考文章：<a href="http://www.blogjava.net/fastunit/archive/2008/02/15/180116.html">http://www.blogjava.net/fastunit/archive/2008/02/15/180116.html</a> <br />
</p>
  <img src ="http://www.blogjava.net/jzone/aggbug/305819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-13 22:41 <a href="http://www.blogjava.net/jzone/articles/305819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>