就是你在init的时候就准备执行SQL,把空值NULL,插入到数据表里,而这个表的字段为("BOCMIS""QRTZ_FIRED_TRIGGERS""PRIORITY") ,这就要看你程序怎么写的了。
以下就对两种定时任务框架进行简单说明。
github地址:>
众所周知spring 的Quartz定时器的功能非常强大,可以在特定的年月日小时分秒的时间点触发时间,完成事件的调度,就像windows中得计划任务一样。下面看一个典型的Quartz定时器的实现:
1、首先实现一个用于被执行的类,这个类用于被定时器调度,这个类不需要继承任何类或者接口,代码如下:
publicTestQuartz{
public void doSomething(){ //TODO } }
2、spring配置文件,具体配置
<!-- 被执行类 -->
<beanid="testQuarzt"class="testtestQuarzt"/>
<!-- 将testQuarzt注入到job中 -->
<beanid="testQuartzJob"class="orgspringframeworkschedulingquartzMethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testQuarzt" /> <property name="targetMethod" value="doSomething" /> <property name="concurrent" value="false" /> </bean>
<!-- 将job注入到定时触发器 -->
<beanid="testTrigger"class="orgspringframeworkschedulingquartzCronTriggerBean"> <property name="jobDetail" ref="testQuartzJob" /> <property name="cronExpression"> <value>0 0 6 <value> <property> <bean>
<!-- 将定时触发器注入任务工程 -->
<beanclass="orgspringframeworkschedulingquartzSchedulerFactoryBean"> <property name="triggers"> <list>
优点:与spring集成、动态添加任务、支持集群
缺点:不支持分布式(只能一个任务在一台服务器上执行,不能分片)
将一个任务拆分成多个独立的任务项,由分布式的服务器分别执行某一个或几个分片项。而传统的定时器任务都在一台服务器上执行,如果数据很大那么压力很大。
举例:处理一百万的订单:A服务器处理尾数偶数的订单,B服务器处理尾数奇数的订单。
整合java项目
1、引入quartz 依赖
2、quartzproperties
3、
注意:
1、每一个job执行都是一个新的线程(即使是同一个任务,这个elastic-job不同)但是如果在配置文件quartzproperties中配置的线程消耗完,也还是会陷入阻塞的。根据业务来预估线程池的大小。(所以的任务共享一个线程池)
2、每一个job执行都会创建一个新的job对象,所以想通过job的成员变量来传递信息是不可行的(每次都会初始化)
3、myJob类必须要有空的构造方法
1、方式1:在创建jobDetail是传递JobDataMap,然后通过JobExecutionContext获取JobDataMap
2、方式2:在myjob中定义成员变量,并生成get,set方法
上面我们知道任务间都是并发处理的,那么要考虑并发安全问题。
1、使用@DisallowConcurrentExecution
使用@PersistJobDataAfterExecution注解和jobDataMapput方法
1、startTime属性:设置trigger第一次触发的时间
2、endTime属性:表示trigger的失效时间点
3、优先级(priority)当多个Trigger并发执行,但是线程不够时触发,会优先执行级别高的Trigger
TriggerBuildernewTrigger()withPriority(10);
默认时5,数字越大优先级越高
4、错过触发(misfire instructions)
1、withMisfireHandlingInstructionDoNothing策略:错过了什么都不做,等待下一次触发时间
设置每5秒执行一次,任务7秒。
发现这样是不会生效的,因为内部判断了一下错过的时间是否大于misfireThreshold这个值(默认5秒),如果小于还是立即执行。这里我们只失效了2秒,是小于5秒的。
通过quartzproperties设置misfireThreshold的值
这样再运行,发现withMisfireHandlingInstructionDoNothing策略生效了。
2、withMisfireHandlingInstructionFireAndProceed策略:错过立即执行
5、日历(calendar)
1、可以在具体的时间点执行一次
2、可以按照指定间隔时间重复若干次
1、使用cron表达式触发
, 代表并且,如果10,20 10秒和20秒都指向
只能出现在日期和星期内,代表没有特定的值。如果使用号日期了星期会有歧义,这是使用
L 只能出现在日期和星期内,表示月的最后一天,或者星期六
W 只能出现在日期内,表示最接近这个日期的工作日
上万个都可以的。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 180。
以上就是关于quartz任务加载的问题 麻烦近来看看全部的内容,包括:quartz任务加载的问题 麻烦近来看看、定时任务框架选型Quartz/Xxl、如何监控java quartz定时器中的所有定时任务等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)