使用Quartz,如何动态的增加Job(运行时添加新的Job)

撸码小丑 2017-10-27 01:49:36
我需要使用Quartz来管理我的各种任务。
基于Quartz的程序写好部署运行后,在系统运转过程中,还会增加很多新的任务。
这些新增加的任务,怎样注册到正在运行的程序中?

因为Quartz是通过JobBuilder.newJob(XXX.class),写到代码中的。
客户会随时增加需求,我就要根据客户的需求,写相应的Job程序,这些新写出来的Job程序,怎么注册到正在运行的程序中?
我的意思是,在程序运行中,新增加一个job。
...全文
2187 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
joe_le 2020-10-28
  • 打赏
  • 举报
回复
这个功能我目前也在做 目前阶段进行到动态生成java类编译.class,类加载器加入内存中,但是quartz它是自己在调用的时候获取数据库存的全路径类名自己反射加载的 要求是在类路径下才行,使用的springboot 打成jar之后就不行了。痛疼这一点呢
liuzhou127 2019-02-23
  • 打赏
  • 举报
回复
Scheduler sched = new StdSchedulerFactory().getScheduler(); JobDetail jobDetail = new JobDetail("jobName", "JOB_GROUP_NAME", Job.class);// 任务名,任务组,任务执行类 CronTrigger trigger = new CronTrigger("jobName", "JOB_GROUP_NAME");// 触发器名,触发器组 trigger.setCronExpression("time");// 触发器时间设定 sched.scheduleJob(jobDetail, trigger); // 启动 if (!sched.isShutdown()) { sched.start(); }
高 斯林 2019-02-22
  • 打赏
  • 举报
回复 1
前段时间,我们项目也遇到了这个需求,因为我们项目用的是xxl-job,所以是重写了xxl-job的API,封装成接口供我们项目自己调用,完美解决运行时动态添加定时任务的需求
:: 2019-02-19
  • 打赏
  • 举报
回复
定时扫描某个包,有新的需求上传class文件到这个包下,然后将这个class添加到定时任务里(或者你也可以用线程去做,一个新的class开一个新的线程,用sleep达到定时的效果)。
Shiro to kuro 2019-02-19
  • 打赏
  • 举报
回复
可以把你想要调用的job加一个锁,符合条件时解开
  • 打赏
  • 举报
回复
可以考虑通过反射的方法实现?全类名直接通过参数指定,你想怎么调用都行,直接反射为对应的实现类,然后获取全类名添加到任务里面
qq_42591591 2019-01-09
  • 打赏
  • 举报
回复
1.SchedulerFactory sf = new StdSchedulerFactory();
2.Scheduler scheduler = sf.getScheduler();
3.JobDetail jobDetail = new JobDetail("SchedulerJob","run_manage",SchedulerJob.class);
4.Trigger trigger = CronTrigger(String name, String group, String cronExpression) ;
5.scheduler.scheduleJob(jobDetail, trigger);
qq_42591591 2019-01-09
  • 打赏
  • 举报
回复
这个是没有spring的环境,如果有spring直接拿到factory,往里面加就可以了
修改的话,也是通过SchedulerFactory 拿到scheduler,然后再修改里面的trigger ,listener,jobdetail之类的
叶遮沉阳 2019-01-03
  • 打赏
  • 举报
回复
可不可以单独设计一个job定时扫描是否有新的job,然后动态将新的job添加进去
qq_41994891 2019-01-03
  • 打赏
  • 举报
回复
你这个做出来没?可否分享一下代码?
maradona1984 2019-01-03
  • 打赏
  • 举报
回复
引用 7 楼 qq_41994891 的回复:
你这个做出来没?可否分享一下代码?

这要分享啥,quartz本就有动态添加的实现的,当然他是基于数据库的

或者你自己写一个,基于zk之类,集群环境就好使多了
define_us 2017-11-01
  • 打赏
  • 举报
回复
引用 4 楼 焘子的回复:
[quote=引用 2 楼 define_us 的回复:] 不停机更新?那就给自己代码开个后门,比如说监听某端口,通过这个端口给程序下达命令,动态加载自己指定位置的类,然后注册到定时任务里。
是希望能调度按需求产生的job对象,指定全类名的话任务就要事先编程好了,应付不了需求。[/quote] 我具体的意思是,你需要新增job的时候把新开发jar包放在一个目录下,然后通过后门把jar包路径和类命传给jvm让他去动态加载这个新开发的jar包,然后通过传入的类名反射类注册到job里面去。
maradona1984 2017-11-01
  • 打赏
  • 举报
回复
Quartz可以传参数的,预先设计好一个job类,根据不同参数路由到具体要调用的服务,因为你说的是不需要重启,那肯定是有规则的,既然有规则就可以考虑从这个方面实现 但你没有透露更多我也无法知道你们不需要重启就能新增新的功能的实现方式
撸码小丑 2017-11-01
  • 打赏
  • 举报
回复
引用 2 楼 define_us 的回复:
不停机更新?那就给自己代码开个后门,比如说监听某端口,通过这个端口给程序下达命令,动态加载自己指定位置的类,然后注册到定时任务里。
是希望能调度按需求产生的job对象,指定全类名的话任务就要事先编程好了,应付不了需求。
撸码小丑 2017-11-01
  • 打赏
  • 举报
回复
引用 1 楼 windowsoahil 的回复:
调用Scheduler.scheduleJob就可以啊
这个只是调度任务,但是问题的根源在于调度任务需要指定JOB的全类名,我是希望能调度按需求产生的job对象
define_us 2017-10-31
  • 打赏
  • 举报
回复
不停机更新?那就给自己代码开个后门,比如说监听某端口,通过这个端口给程序下达命令,动态加载自己指定位置的类,然后注册到定时任务里。
解开者 2017-10-30
  • 打赏
  • 举报
回复
调用Scheduler.scheduleJob就可以啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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