我需要使用Quartz來管理我的各種任務。
基于Quartz的程式寫好部署運行后,在系統運轉程序中,還會增加很多新的任務。
這些新增加的任務,怎樣注冊到正在運行的程式中?
因為Quartz是通過JobBuilder.newJob(XXX.class),寫到代碼中的。
客戶會隨時增加需求,我就要根據客戶的需求,寫相應的Job程式,這些新寫出來的Job程式,怎么注冊到正在運行的程式中?
我的意思是,在程式運行中,新增加一個job。
uj5u.com熱心網友回復:
呼叫Scheduler.scheduleJob就可以啊uj5u.com熱心網友回復:
不停機更新?那就給自己代碼開個后門,比如說監聽某埠,通過這個埠給程式下達命令,動態加載自己指定位置的類,然后注冊到定時任務里。uj5u.com熱心網友回復:
這個只是調度任務,但是問題的根源在于調度任務需要指定JOB的全類名,我是希望能調度按需求產生的job物件
uj5u.com熱心網友回復:
是希望能調度按需求產生的job物件,指定全類名的話任務就要事先編程好了,應付不了需求。
uj5u.com熱心網友回復:
Quartz可以傳引數的,預先設計好一個job類,根據不同引數路由到具體要呼叫的服務,因為你說的是不需要重啟,那肯定是有規則的,既然有規則就可以考慮從這個方面實作但你沒有透露更多我也無法知道你們不需要重啟就能新增新的功能的實作方式
uj5u.com熱心網友回復:
我具體的意思是,你需要新增job的時候把新開發jar包放在一個目錄下,然后通過后門把jar包路徑和類命傳給jvm讓他去動態加載這個新開發的jar包,然后通過傳入的類名反射類注冊到job里面去。
uj5u.com熱心網友回復:
你這個做出來沒?可否分享一下代碼?uj5u.com熱心網友回復:
可不可以單獨設計一個job定時掃描是否有新的job,然后動態將新的job添加進去uj5u.com熱心網友回復:
你這個做出來沒?可否分享一下代碼?
這要分享啥,quartz本就有動態添加的實作的,當然他是基于資料庫的
或者你自己寫一個,基于zk之類,集群環境就好使多了
uj5u.com熱心網友回復:
這個是沒有spring的環境,如果有spring直接拿到factory,往里面加就可以了修改的話,也是通過SchedulerFactory 拿到scheduler,然后再修改里面的trigger ,listener,jobdetail之類的
uj5u.com熱心網友回復:
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);
uj5u.com熱心網友回復:
可以考慮通過反射的方法實作?全類名直接通過引數指定,你想怎么呼叫都行,直接反射為對應的實作類,然后獲取全類名添加到任務里面uj5u.com熱心網友回復:
定時掃描某個包,有新的需求上傳class檔案到這個包下,然后將這個class添加到定時任務里(或者你也可以用執行緒去做,一個新的class開一個新的執行緒,用sleep達到定時的效果)。uj5u.com熱心網友回復:
可以把你想要呼叫的job加一個鎖,符合條件時解開uj5u.com熱心網友回復:
前段時間,我們專案也遇到了這個需求,因為我們專案用的是xxl-job,所以是重寫了xxl-job的API,封裝成介面供我們專案自己呼叫,完美解決運行時動態添加定時任務的需求uj5u.com熱心網友回復:
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();
}
uj5u.com熱心網友回復:
這個功能我目前也在做 目前階段進行到動態生成java類編譯.class,類加載器加入記憶體中,但是quartz它是自己在呼叫的時候獲取資料庫存的全路徑類名自己反射加載的 要求是在類路徑下才行,使用的springboot 打成jar之后就不行了。痛疼這一點呢轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195414.html
標籤:Java SE
