quartz集群 相同的任务串行,不同的任务并行

The-Sky 2017-11-15 05:15:25
定时任务类继承QuartzJobBean,例如:
public class TestJobTask extends QuartzJobBean{

public void test1(){
System.out.println("*****************quartz Job************");
}
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
test1();
}
}

通过代码添加定时任务的,代码如:
@SuppressWarnings({ "rawtypes" })
@Override
public String addJob(Map<String,String> params){
try {
String jobName = StringUtil.toString(params.get("jobName")).trim();
String jobGroupName = StringUtil.toString(params.get("jobGroupName")).trim();
String triggerName = StringUtil.toString(params.get("triggerName")).trim();
String triggerGroupName = StringUtil.toString(params.get("triggerGroupName")).trim();
String className = StringUtil.toString(params.get("className")).trim();
Class jobClass = Class.forName(className);
String description = StringUtil.toString(params.get("description")).trim();
String time = StringUtil.toString(params.get("time")).trim();
JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
jobDetail.setDurability(true); //任务完成后任然将任务保存在数据库
// 触发器
jobDetail.setDescription(description);
CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
trigger.setDescription(description);
trigger.setCronExpression(time);// 触发器时间设定
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);//任务超时不补充任务
scheduler.scheduleJob(jobDetail, trigger);
scheduler.pauseTrigger(triggerName, triggerGroupName);
return "200";
} catch (Exception e) {
e.printStackTrace();
return "500";
}
}

但是现在 相同的任务可能出现并发的情况, 第一个任务还未执行完,第二个任务触发器触发执行了,会造成并发状况,现在想要解决的是相同的任务串行,不同的任务并行。

在网上找了好久,有两种方案,方案一是implements StatefulJob ,将job定义成一个有状态的job,但是这样的话,所有的job都是串行,比如任务A和任务B是两个不同的任务,但是变成有状态的job之后,任务A在执行,则任务B不会执行,B所属的trigger处于阻塞状态,除非A执行完,B才可能触发执行。这样虽然job串行,但是所有的任务都串行了。方案二则是在配置文件里面配置
 <property name="concurrent" value="false"/>  
</bean>
但是这个方案实现的效果和上面相同,所有任务串行。

由于公司项目是spring2.5,quartz只能使用2.0以下,网上所说的使用@DisallowConcurrentExecution注解,禁止并发。但是我使用是quartz1.6.5,没有这个注解。现在请教一下大家有没有什么方案使得相同的任务串行,不同的任务并行。
...全文
911 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
繁华终归落尽 2017-11-17
  • 打赏
  • 举报
回复
引用 4 楼 weixin_35702196 的回复:
引用 2 楼 l359122505 的回复:
串行可以自己实现,每个JOB在数据库维护一个状态位,执行前先去查询执行状态,若在执行中,则跳过或等待N秒再判断
请问怎么避免前一个任务死了,状态未被修改,而后一个任务不能执行呢。
设置一个超时回滚就行了
The-Sky 2017-11-17
  • 打赏
  • 举报
回复
引用 3 楼 qq_36423706 的回复:
@PersistJobDataAfterExecution @DisallowConcurrentExecution// 不允许并发执行 增加两个注解试试
版本太低了,没有这个注解呢,2.0quartz才有这个注解吧。
The-Sky 2017-11-17
  • 打赏
  • 举报
回复
引用 2 楼 l359122505 的回复:
串行可以自己实现,每个JOB在数据库维护一个状态位,执行前先去查询执行状态,若在执行中,则跳过或等待N秒再判断
请问怎么避免前一个任务死了,状态未被修改,而后一个任务不能执行呢。
繁华终归落尽 2017-11-16
  • 打赏
  • 举报
回复
串行可以自己实现,每个JOB在数据库维护一个状态位,执行前先去查询执行状态,若在执行中,则跳过或等待N秒再判断
tianfang 2017-11-16
  • 打赏
  • 举报
回复
串行任务就不能考定时器启动,定时器到时间就启动。而串行任务是由前置任务触发而不是按时间触发
  • 打赏
  • 举报
回复
@PersistJobDataAfterExecution @DisallowConcurrentExecution// 不允许并发执行 增加两个注解试试
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧