类图
步骤描述(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 )。这允许您创建新的就业机会和触发器,并控制和监视整个调度。
分享到:
相关推荐
定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务
一直用线程池,但有些时候发现线程池无法控制结束某个超时等待的线程任务,所以就勉为其难的自己写了个线程管理~。作用:模仿线程池操作,管理多线程任务,超时,以及完成任务的回调。如果有bug自行处理,服务器挂机...
基于Java+netty内置时间轮工具处理大批量定时或超时任务工具源码.zip
任务超时处理是比较常见的需求,Java中对超时任务的处理有两种方式,在文中给大家详细介绍,本文重点给大家介绍Java实现任务超时处理方法,需要的朋友可以参考下
PHP超时处理全面总结
MySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时...
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。 Future接口是一个泛型接口,严格的格式应该是Future...
java超时取消正则表达式匹配方法,代码超时处理,设置代码执行时间,超棒的工具类 lambda,Callable,ExecutorService,超过执行5秒退出
登录超时完整实例、session超时设置、JSP页面会话超时 可以直接运行的myeclipse下的超时实例
Modbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus ...
C# 的一个超时类,内置一个正则的超时实现
分享一个简单的超时处理事例供大家参考;可以设置超时时间,超时就退出函数执行
流程超时功能的使用
Modbus RTU 通信连接超时参数.pdfModbus RTU 通信连接超时参数.pdfModbus RTU 通信连接超时参数.pdfModbus RTU 通信连接超时参数.pdfModbus RTU 通信连接超时参数.pdfModbus RTU 通信连接超时参数.pdfModbus RTU ...
单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换...
函数超时判断,可自定义超时时间,以毫秒为单位。 使用泛型,可设置输入、输出类型。 纯手工制作,不使用第三方插件,即下即用, 你还在为函数超时问题无从下手吗?下载,看源码!!!
本来以为是偶尔的网络问题,但是,同学发现在测试服务器上,很稳定的复现超时!但是在我们本地测试过程中,请求微信服务器又很快响应。嗯,理论上微信服务器不会出问题的…… 试着在服务器上去 curl 微信的接口,...