`
java-mans
  • 浏览: 11454571 次
文章分类
社区版块
存档分类
最新评论

超时任务总结(tradingTask)

 
阅读更多

类图

步骤描述(Description)

步骤:

1. 超时任务启动类TimerMain,负责对trigger启用与禁用

2. 任务启动之前会加载若干Service服务。

服务路径:/classpath/timer/timer-services.xml",

<service name="BeanFactoryService" class="com.alibaba.service.spring.DefaultBeanFactoryService">
<property name="bean.descriptors">
<value>classpath/timer/timer-bean.xml</value>
<value>classpath/timer/timer-quartz.xml</value>
<value>classpath/timer/timer-dao.xml</value>
<value>classpath/timer/timer-napoli.xml</value>
<value>classpath/timer/timer-resendgoods.xml</value>
<value>classpath/timer/timer-closeorder.xml</value>
<value>classpath/timer/timer-remindinadvance.xml</value>
<value>classpath/timer/timer-dubbo.xml</value>
<value>classpath/timer/timer-sendgoodstimeout.xml</value>
</property>
</service>

重要的服务如"BeanFactoryService",根据spring的IOC机制会实例所需求的bean对象并相应的注入基本数据或外部bean对象(资料)。


接下来便是本文的重点:关于Quqrtz定时任务的配置

首先简单介绍下Quartz

Quartz有三个核心的概念:调度器,任务,触发器

触发器:Trigger是一个类,描述触发Job执行的时间触发规则,主要有SimpleTrigger和CronTrigger两种类型。

任务:主要是Job接口,通过复写里面的void execute(JobExcecutionContext context)方法实现该接口里面定义的运行任务。

调度器:Scheduler是一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Schedule中,分别拥有各自的组和名称。

以SimpleTrigger为例,任务的步骤为:

  • 创建一个JobDetail实例并指定具体的Job实现子类
  • 创建一个SimpleTrigger类,配置开始时间、间隔时间等规则
  • 实例一个ScheduleFactory工厂类,并获取一个Schedule容器
  • 将任务和触发规则一并注入到Schedule中
  • 启动任务。

TradingTask为例:

<bean id="timerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
autowire="no">
<property name="triggers">
<list>
<ref bean="defaultTrigger" />
<ref bean="quotationExpireTrigger" />
<ref bean="orderExpireTrigger" />
<ref bean="reSendGoodsTrigger" />
<ref bean="remindTrigger"/>
<ref bean="sendGoodsTimeoutTrigger"/>
</list>
</property>
<property name="autoStartup">
<value>true</value>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
</props>
</property>
</bean>

其中SchedulerFactoryBean中以list集合方式注入多个Trigger触发器.

autoStartup表示SchedulerFactoryBean初始化后立即启动Scheduler

org.quartz.simpl.RAMJobStore配置任务调度现场数据保存机制,数据保存在RAM内存中

以 报价单过期任务 触发器 为例:

<bean id="quotationExpireTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="quotationExpireJob" />
</property>
<property name="cronExpression">
<value>$trading_quotationexpiretrigger_cronexpression</value>
</property>
</bean>
其中CronTriggerBean扩展于CronTrigger,触发器即为Bean的名称,保存在默认组中。
jboDetail对应的是org.springframework.scheduling.quartz.JobDetailBean反射出来的对象,用于配置一个具体的任务,下文会介绍

cronExpression为具体的调度规则,配置在figo中,cron表过式由6或7个空格分隔的时间字段组成,支持日历相关的重复时间间隔,而非简单的周期时间间隔,具体可参照资料

报价单过期任务
<bean id="quotationExpireJob" class="org.springframework.scheduling.quartz.JobDetailBean"
scope="singleton" autowire="no">
<property name="jobClass">
<value>com.alibaba.china.trading.task.timer.job.TimerJob</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="timerScanner" value-ref="quotationExpireTimerScanner" />
<entry key="jobName" value="quotationExpire" />
</map>
</property>
</bean>

JobDetailBean扩展于Quartz的JobDetail,主要是为了解决JobDetail使用带参数的构造函数,在spring中不方便配置的问题

jobclass:配置一个Job接口的任务类

jobDataAsMap:类型为Map,为上面的任务所对应的JobDataMap提供值,采用该项目配置主要是由于无法在spring中配置JobDataMap类型的属性信息,所以在spring中通过jobDataAsMap设置JobDataMap值。里面的 value-ref="quotationExpireTimerScanner" 是TimerScanner扫描器的子类,为一个普通的bean对象(配置在timer-bean.xml中),通过

private Map<String, TimerExecutor> timerExecutors = new HashMap<String, TimerExecutor>();

封装了多个类型的超时任务处理方法(报价单当天过期关闭 ,报价单过期N天关闭 默认30天)

注意:关于org.springframework.scheduling.quartz.SchedulerFactoryBean 强制转换 Scheduler

FactoryBean创建和配置一个石英Scheduler ,管理作为Spring应用程序上下文的一部分其生命周期,并公开为豆依赖注入参考调度。

允许JobDetails登记,日历和触发器,在初始化时自动启动和关闭调度关于销毁它。在方案中,仅仅需要在启动时工作静态注册, 也没有必要在应用程序代码访问调度实例本身。

对于工作在运行时动态注册,使用一个bean引用此SchedulerFactoryBean来获得直接进入Quartz调度( org.quartz.Scheduler )。这允许您创建新的就业机会和触发器,并控制和监视整个调度。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics