3:在Spring配置job,trigger,Scheduler,Listener组件
<!-- 扫描商家状态创建定时任务 -->
<bean id="accountStatusTaskScannerJobDetail"
class="org.springframework.scheng.quartz.JobDetailBean">
<property name="name" value="accountStatusTaskScannerJobDetail"></property>
<property name="group" value="CrmAccountGroup"></property>
<property name="jobClass" value="***.crm.quartz.job.AccountStatusTaskScannerJob"></property>
<!-- requestsRecovery属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务-->
<property name="requestsRecovery" value="true"/>
<!-- 标识job是持久的,删除所有触发器的时候不被删除 -->
<property name="durability" value="true"/>
<property name="volatility" value="false"></property>
</bean>
<bean id="accountStatusTaskScannerTrigger" class="org.springframework.scheng.quartz.CronTriggerBean">
<property name="group" value="CrmDealGroup"></property>
<property name="name" value="accountStatusTaskScannerTrigger"></property>
<property name="jobDetail" ref="accountStatusTaskScannerJobDetail"></property>
<property name="cronExpression" value="0 0 1 * * ?"></property>
</bean>
<!-- 定义Quartz 器 -->
<bean id="quartzExceptionSchedulerListener"
class="***.crm.quartz.listener.QuartzExceptionSchedulerListener"></bean>
<!-- Quartz调度工厂 -->
<bean id="quartzScheduler"
class="org.springframework.scheng.quartz.SchedulerFactoryBean">
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">CRMscheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<!-- 线程池配置 -->
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">20</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<!-- JobStore 配置 -->
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<!-- 集群配置 -->
<prop key="org.quartz.jobStore.isClustered">false</prop>
<prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>
<prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>
<!-- 数据源配置 使用DBCP连接池 数据源与dataSource一致 -->
<prop key="org.quartz.jobStore.dataSource">myDS</prop>
<prop key="org.quartz.dataSource.myDS.driver">${database.driverClassName}</prop>
<prop key="org.quartz.dataSource.myDS.URL">${database.url}</prop>
<prop key="org.quartz.dataSource.myDS.user">${database.username}</prop>
<prop key="org.quartz.dataSource.myDS.password">${database.password}</prop>
<prop key="org.quartz.dataSource.myDS.maxConnections">5</prop>
<prop key="org.quartz.jobStore.misfireThreshold">120000</prop>
</props>
</property>
<property name="schedulerName" value="CRMscheduler" />
<!--必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动-->
<property name="startupDelay" value="30"/>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
<!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->
<property name="overwriteExistingJobs" value="true" />
<!-- 设置自动启动 -->
<property name="autoStartup" value="true" />
<!-- 注册触发器 -->
<property name="triggers">
<list>
<ref bean="dailyStatisticsTrigger" />
<ref bean="accountGrabedScannerTrigger" />
<ref bean="syncAccountFromPOITrigger" />
<ref bean="userSyncScannerTrigger" />
<ref bean="syncParentBranchFromPOITrigger"/>
<ref bean="privateReminderTrigger" />
<ref bean="onlineBranchesScannerTrigger" />
<ref bean="syncCtContactServiceTrigger" />
<ref bean="dealLinkDianpingScannerTrigger" />
<ref bean="accountStatusTaskScannerTrigger"/>
<ref bean="nDaysActivityScannerTrigger"/>
</list>
</property>
<!-- 注册jobDetail -->
<property name="jobDetails">
<list>
<ref bean="myTestQuartzJobDetail"/>
<ref bean="accountPrivateToProtectedJobDetail"/>
<ref bean="accountProtectedToPublicJobDetail"/>
<ref bean="nDaysActivityToProtectedJobDetail"/>
</list>
</property>
<property name="schedulerListeners">
<list>
<ref bean="quartzExceptionSchedulerListener"/>
</list>
</property>
</bean>
Crm目前可以做到对Quartz实例的监控,操作.动态部署Trigger




后续待开发功能和问题
1:目前实现对job,Trigger操作,动态部署Trigger,后续需要加入Calendar(排除特定日期),Listener(动态加载监控),Job的动态部署(只要bean的名称和方法名,就可完成对job生成,部署)
2:由于Quartz集群中的job目前是在任意一台server中执行,Quartz日志生成各自的系统目录中, quartz日志无法统一.
3:Quartz2.x已经支持可选节点执行job(期待Spring升级后对新Quartz支持)
4:Quartz内部的DB操作大量Trigger存在严重竞争问题,瞬间大量trigger执行,目前只能通过(org.quartz.jobStore.tablePrefix = QRTZ)分表操作,存在长时间lock_wait(新版本据说有提高);
5:如果有需要,可以抽取出Quartz,变成单独的服务,供其它系统调度使用使用
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29777-21.html
太帅
一切有教养的民族
很好听