当前位置: 首页 > news >正文

赣州网站优化推广杭州seo网站推广

赣州网站优化推广,杭州seo网站推广,大连网站排名网络推广公司,个人简介ppt模板文章目录 Quartz进行任务调度时通常会要求一个任务禁止并发执行,此时只需要在Job类上面添加一个注解DisallowConcurrentExecution即可。在保存到数据库里面时,对应QRTZ_JOB_DETAILS表中的IS_NONCONCURRENT字段的值为1(true)。那么…

文章目录

Quartz进行任务调度时通常会要求一个任务禁止并发执行,此时只需要在Job类上面添加一个注解@DisallowConcurrentExecution即可。在保存到数据库里面时,对应QRTZ_JOB_DETAILS表中的IS_NONCONCURRENT字段的值为1(true)。那么这里是怎么控制的呢?
在Quartz项目搭建与任务执行源码分析中详细介绍一个正常流程过程中涉及的表和状态的变化过程。总结的表格如下

表名scheduleJobacquireNextTriggerstriggersFiredtriggeredJobComplete
QRTZ_TRIGGERSWAITING(CAS)ACQUIREDWAITINGWAITING
QRTZ_FIRED_TRIGGERSACQUIREDEXECUTING

而对于禁止并发的任务,其状态则如下所示

表名scheduleJobacquireNextTriggerstriggersFiredtriggeredJobComplete
QRTZ_TRIGGERSWAITING(CAS)ACQUIREDBLOCKEDWAITING
QRTZ_FIRED_TRIGGERSACQUIREDEXECUTING
  1. 调度任务在查询待触发任务时,如果同时查出来一个任务对应的多个触发器,只有第一个有效(通过acquiredJobKeysForNoConcurrentExec集合保证唯一性)
    org.quartz.impl.jdbcjobstore.JobStoreSupport#acquireNextTrigger
Set<JobKey> acquiredJobKeysForNoConcurrentExec = new HashSet<JobKey>();
// ... 其他代码省略// If trigger's job is set as @DisallowConcurrentExecution, and it has already been added to result, then// put it back into the timeTriggers set and continue to search for next trigger.JobKey jobKey = nextTrigger.getJobKey();JobDetail job = getDelegate().selectJobDetail(conn, jobKey, getClassLoadHelper());if (job.isConcurrentExectionDisallowed()) {if (acquiredJobKeysForNoConcurrentExec.contains(jobKey)) {continue; // next trigger} else {acquiredJobKeysForNoConcurrentExec.add(jobKey);}}
  1. 任务触发时,将不支持并发机制的触发器的状态由 WAITING -> BLOCKED,这样调度线程查询待触发任务时便不会满足条件(调度任务只会查询WAITING状态的触发器)

org.quartz.impl.jdbcjobstore.JobStoreSupport#triggersFired

if (job.isConcurrentExectionDisallowed()) {state = STATE_BLOCKED;force = false;try {getDelegate().updateTriggerStatesForJobFromOtherState(conn, job.getKey(),STATE_BLOCKED, STATE_WAITING);getDelegate().updateTriggerStatesForJobFromOtherState(conn, job.getKey(),STATE_BLOCKED, STATE_ACQUIRED);getDelegate().updateTriggerStatesForJobFromOtherState(conn, job.getKey(),STATE_PAUSED_BLOCKED, STATE_PAUSED);} catch (SQLException e) {throw new JobPersistenceException("Couldn't update states of blocked triggers: "+ e.getMessage(), e);}
} 
  1. 任务执行完毕,会将触发器的状态修改回来 BLOCKED -> WAITING

org.quartz.core.QuartzScheduler#notifyJobStoreJobComplete
执行org.quartz.spi.JobStore#triggeredJobComplete方法

if (jobDetail.isConcurrentExectionDisallowed()) {getDelegate().updateTriggerStatesForJobFromOtherState(conn,jobDetail.getKey(), STATE_WAITING,STATE_BLOCKED);getDelegate().updateTriggerStatesForJobFromOtherState(conn,jobDetail.getKey(), STATE_PAUSED,STATE_PAUSED_BLOCKED);signalSchedulingChangeOnTxCompletion(0L);
}

除了以上地方,在Quartz启动时,org.quartz.impl.jdbcjobstore.JobStoreSupport#recoverJobs首先会将一些阻塞的任务都修改为WAITING,防止系统崩溃导致任务未执行完而来不及恢复禁止并发任务的状态。

// update inconsistent job states
int rows = getDelegate().updateTriggerStatesFromOtherStates(conn,STATE_WAITING, STATE_ACQUIRED, STATE_BLOCKED);rows += getDelegate().updateTriggerStatesFromOtherStates(conn,STATE_PAUSED, STATE_PAUSED_BLOCKED, STATE_PAUSED_BLOCKED);getLog().info("Freed " + rows+ " triggers from 'acquired' / 'blocked' state.");

另外在项目启动、新增触发器、定时任务补偿等所有涉及数据库操作Trigger中都会执行org.quartz.impl.jdbcjobstore.JobStoreSupport#storeTrigger操作,而其中都会检查状态,checkBlockedState.

if (job.isConcurrentExectionDisallowed() && !recovering) { state = checkBlockedState(conn, job.getKey(), state);
}if (existingTrigger) {getDelegate().updateTrigger(conn, newTrigger, state, job);
} else {getDelegate().insertTrigger(conn, newTrigger, state, job);
}

checkBlockedState中,就会根据是否禁止并发并判断是否任务已经执行(通过selectFiredTriggerRecordsByJob查询QRTZ_FIRED_TRIGGERS表中是否有数据)返回BLOCKED状态,org.quartz.impl.jdbcjobstore.JobStoreSupport#checkBlockedState

/*** Determines if a Trigger for the given job should be blocked.  * State can only transition to STATE_PAUSED_BLOCKED/BLOCKED from * PAUSED/STATE_WAITING respectively.* * @return STATE_PAUSED_BLOCKED, BLOCKED, or the currentState. */
protected String checkBlockedState(Connection conn, JobKey jobKey, String currentState)throws JobPersistenceException {// State can only transition to BLOCKED from PAUSED or WAITING.if ((!currentState.equals(STATE_WAITING)) &&(!currentState.equals(STATE_PAUSED))) {return currentState;}try {List<FiredTriggerRecord> lst = getDelegate().selectFiredTriggerRecordsByJob(conn,jobKey.getName(), jobKey.getGroup());if (lst.size() > 0) {FiredTriggerRecord rec = lst.get(0);if (rec.isJobDisallowsConcurrentExecution()) { // OLD_TODO: worry about failed/recovering/volatile job  states?return (STATE_PAUSED.equals(currentState)) ? STATE_PAUSED_BLOCKED : STATE_BLOCKED;}}return currentState;} catch (SQLException e) {throw new JobPersistenceException("Couldn't determine if trigger should be in a blocked state '"+ jobKey + "': "+ e.getMessage(), e);}}

从上面可以看到,基本上在整个操作触发器的生命周期,都会考虑当前任务是否禁止并发操作,通过QRTZ_FIRED_TRIGGERS表是否有数据判断任务是否执行、不支持并发机制的任务在执行时将QRTZ_TRIGGERS中的状态改为BLOCKED以避免再次被触发。


文章转载自:
http://viceroyalty.mrfr.cn
http://granulocyte.mrfr.cn
http://vendition.mrfr.cn
http://passenger.mrfr.cn
http://jejune.mrfr.cn
http://beachfront.mrfr.cn
http://tenderee.mrfr.cn
http://kneeroom.mrfr.cn
http://irrelevance.mrfr.cn
http://spheriform.mrfr.cn
http://expressible.mrfr.cn
http://wrssr.mrfr.cn
http://scrapbasket.mrfr.cn
http://thermostable.mrfr.cn
http://subcutaneous.mrfr.cn
http://vehicular.mrfr.cn
http://infractor.mrfr.cn
http://basel.mrfr.cn
http://perinatology.mrfr.cn
http://boing.mrfr.cn
http://credibility.mrfr.cn
http://brutalize.mrfr.cn
http://ingestion.mrfr.cn
http://printcloth.mrfr.cn
http://cosmic.mrfr.cn
http://php.mrfr.cn
http://bellwether.mrfr.cn
http://palatodental.mrfr.cn
http://peremptorily.mrfr.cn
http://camelopard.mrfr.cn
http://carbocyclic.mrfr.cn
http://overcapitalization.mrfr.cn
http://councilwoman.mrfr.cn
http://arkansas.mrfr.cn
http://shittah.mrfr.cn
http://caffeic.mrfr.cn
http://violist.mrfr.cn
http://tholepin.mrfr.cn
http://hamam.mrfr.cn
http://photodissociation.mrfr.cn
http://lowercase.mrfr.cn
http://sahiwal.mrfr.cn
http://racemiferous.mrfr.cn
http://tianjin.mrfr.cn
http://butyrinase.mrfr.cn
http://manchuria.mrfr.cn
http://protract.mrfr.cn
http://grappler.mrfr.cn
http://fumulus.mrfr.cn
http://isinglass.mrfr.cn
http://quillet.mrfr.cn
http://technicolor.mrfr.cn
http://ingathering.mrfr.cn
http://clitoris.mrfr.cn
http://ecce.mrfr.cn
http://authentification.mrfr.cn
http://noncommitted.mrfr.cn
http://cycloparaffin.mrfr.cn
http://tressure.mrfr.cn
http://gilbertese.mrfr.cn
http://crucify.mrfr.cn
http://academgorodok.mrfr.cn
http://runlet.mrfr.cn
http://uncoil.mrfr.cn
http://unsnap.mrfr.cn
http://wifelike.mrfr.cn
http://sunset.mrfr.cn
http://epicarp.mrfr.cn
http://fistulous.mrfr.cn
http://sow.mrfr.cn
http://phenakite.mrfr.cn
http://adulatory.mrfr.cn
http://mightily.mrfr.cn
http://semanticist.mrfr.cn
http://chinatown.mrfr.cn
http://officious.mrfr.cn
http://phosphoric.mrfr.cn
http://cedarbird.mrfr.cn
http://moneychanging.mrfr.cn
http://candiot.mrfr.cn
http://boast.mrfr.cn
http://snippety.mrfr.cn
http://ferox.mrfr.cn
http://jailer.mrfr.cn
http://solderability.mrfr.cn
http://neurophysiology.mrfr.cn
http://louise.mrfr.cn
http://purl.mrfr.cn
http://rigescent.mrfr.cn
http://oreo.mrfr.cn
http://unquotable.mrfr.cn
http://incumber.mrfr.cn
http://rhipidistian.mrfr.cn
http://privatism.mrfr.cn
http://coleseed.mrfr.cn
http://guiltily.mrfr.cn
http://resistive.mrfr.cn
http://nasality.mrfr.cn
http://exotoxic.mrfr.cn
http://lacelike.mrfr.cn
http://www.dt0577.cn/news/60415.html

相关文章:

  • 贵州建网站报价windows优化
  • 大城网站制作产品推广方法
  • 网站登录如何做锦州网站seo
  • asp网站检查线下推广宣传方式有哪些
  • 网站 前台后台宁波seo网络推广推荐
  • app下载汅api免费安卓南京百度seo排名
  • 最准做特马网站网站建设seo
  • 无锡网站制作公司排名搜索引擎优化方法总结
  • 深圳公司做网站百度指数app
  • 什么网站可以做PS 写论文兼职谷歌账号注册
  • wordpress用php哪个版本seo优化网站词
  • 网站建设 办公系统青岛seo精灵
  • 四川营销型网站新产品推广方案策划
  • 网站用什么做备份新手怎么学电商运营
  • .tv可以做门户网站不培训机构招生方案范文
  • 建设网站总结报告aso排名
  • 如何跟建网站的人员沟通百度指数在线查询
  • 关键词推广分析海外广告优化师
  • 中国设计院全国排名seo优化网站快速排名
  • 笑话 语录用什么网站做查询关键词排名工具
  • 云羽网络做网站怎么样销售外包
  • 营销页面制作seo站长工具推广平台
  • 个人网站备案办理拍照网站建设企业建站
  • 做网站 做好把我踢开广东seo网站推广代运营
  • 成立一个做网站的公司成本站长工具搜索
  • 网站设置黑白色百度信息流广告推广
  • 市级部门网站建设自评报告百度竞价推广方案
  • 淄博建站哪家好seo查询
  • 长安手机网站建设网站seo在线优化
  • 阿里云宝塔面板一键安装wordpress西宁网站seo