本文目錄一覽:
- 1、java中如何實現Job Scheduing
- 2、java quartz job 執行時間配置
- 3、怎麼實現java簡單調用kettle我自己做好的job
- 4、用java代碼 道怎樣停止一個運行的job,我發現沒法停掉它.只能把整個進程退出才行.
java中如何實現Job Scheduing
例如:
/**
* @author kevin zhou
*
* 在Java中實現Job Scheduling
* 創建日期 2004-7-13
*/
import java.util.TimerTask;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class ReportGenerator extends TimerTask{
/* (非 Javadoc)
* @see java.util.TimerTask#run()
*/
public void run() {
System.out.println(“Generating report”);
}
}
class MainApplication {
public static void main(String[] args) {
Timer timer=new Timer();
Calendar date = Calendar.getInstance();
date.set(
Calendar.DAY_OF_WEEK,
Calendar.SUNDAY
);
date.set(Calendar.HOUR, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
// Schedule to run every Sunday in midnight
timer.schedule(
new ReportGenerator(),
date.getTime(),
1000 * 60 * 60 * 24 * 7
);
}
}
此處簡單解釋一下,在此例子中ReportGenerator繼承java.util.TimerTask,它又繼承了java.lang.Runnable,我們需要覆蓋run()方法。
調用時用schedule()方法讓它每周日0點0分執行,避開服務器高峰,實現Job Scheduling的目的。
補充:Java是一種可以撰寫跨平台應用軟件的面向對象的程序設計語言。Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於PC、數據中心、遊戲控制台、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。
java quartz job 執行時間配置
第一步:引包
要使用Quartz,必須要引入以下這幾個包:
1、log4j-1.2.16
2、quartz-2.1.7
3、slf4j-api-1.6.1.jar
4、slf4j-log4j12-1.6.1.jar
這些包都在下載的Quartz包裡面包含着,因此沒有必要為尋找這幾個包而頭疼。
第二步:創建要被定執行的任務類
這一步也很簡單,只需要創建一個實現了org.quartz.Job接口的類,並實現這個接口的唯一一個方法execute(JobExecutionContext arg0) throws JobExecutionException即可。如:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class myJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss SSS”);
System.out.println(sdf.format(new Date()));
}
}
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class myJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss SSS”);
System.out.println(sdf.format(new Date()));
}
}
這個例子很簡單,就不用解說了。
第三步:創建任務調度,並執行
這一步應該算是最難的一步的,但其實是非常簡單的,直接上代碼
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class Test {
public void go() throws Exception {
// 首先,必需要取得一個Scheduler的引用
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
//jobs可以在scheduled的sched.start()方法前被調用
//job 1將每隔20秒執行一次
JobDetail job = newJob(myJob.class).withIdentity(“job1”, “group1”).build();
CronTrigger trigger = newTrigger().withIdentity(“trigger1”, “group1”).withSchedule(cronSchedule(“0/20 * * * * ?”)).build();
Date ft = sched.scheduleJob(job, trigger);
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss SSS”);
System.out.println(job.getKey() + ” 已被安排執行於: ” + sdf.format(ft) + “,並且以如下重複規則重複執行: ” + trigger.getCronExpression());
// job 2將每2分鐘執行一次(在該分鐘的第15秒)
job = newJob(myJob.class).withIdentity(“job2”, “group1”).build();
trigger = newTrigger().withIdentity(“trigger2”, “group1”).withSchedule(cronSchedule(“15 0/2 * * * ?”)).build();
ft = sched.scheduleJob(job, trigger);
System.out.println(job.getKey() + ” 已被安排執行於: ” + sdf.format(ft) + “,並且以如下重複規則重複執行: “+ trigger.getCronExpression());
// 開始執行,start()方法被調用後,計時器就開始工作,計時調度中允許放入N個Job
sched.start();
try {
//主線程等待一分鐘
Thread.sleep(60L * 1000L);
} catch (Exception e) {}
//關閉定時調度,定時器不再工作
sched.shutdown(true);
}
public static void main(String[] args) throws Exception {
Test test = new Test();
test.go();
}
}
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class Test {
public void go() throws Exception {
// 首先,必需要取得一個Scheduler的引用
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
//jobs可以在scheduled的sched.start()方法前被調用
//job 1將每隔20秒執行一次
JobDetail job = newJob(myJob.class).withIdentity(“job1”, “group1”).build();
CronTrigger trigger = newTrigger().withIdentity(“trigger1”, “group1”).withSchedule(cronSchedule(“0/20 * * * * ?”)).build();
Date ft = sched.scheduleJob(job, trigger);
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss SSS”);
System.out.println(job.getKey() + ” 已被安排執行於: ” + sdf.format(ft) + “,並且以如下重複規則重複執行: ” + trigger.getCronExpression());
// job 2將每2分鐘執行一次(在該分鐘的第15秒)
job = newJob(myJob.class).withIdentity(“job2”, “group1”).build();
trigger = newTrigger().withIdentity(“trigger2”, “group1”).withSchedule(cronSchedule(“15 0/2 * * * ?”)).build();
ft = sched.scheduleJob(job, trigger);
System.out.println(job.getKey() + ” 已被安排執行於: ” + sdf.format(ft) + “,並且以如下重複規則重複執行: “+ trigger.getCronExpression());
// 開始執行,start()方法被調用後,計時器就開始工作,計時調度中允許放入N個Job
sched.start();
try {
//主線程等待一分鐘
Thread.sleep(60L * 1000L);
} catch (Exception e) {}
//關閉定時調度,定時器不再工作
sched.shutdown(true);
}
public static void main(String[] args) throws Exception {
Test test = new Test();
test.go();
}
}
OK了,Job1和Job2就會被安排為定時執行了。此時程序是可以執行的了,但是可能會輸出WARN級別日誌,這是因為沒有加log4j的配置文件,加上配置文件,就OK了。這裡需要說明的地方只有一個,其它的可以直接Copy到您的項目裡面。看代碼:
CronTrigger trigger = newTrigger().withIdentity(“trigger1”, “group1”).withSchedule(cronSchedule(“0/20 * * * * ?”)).build();
CronTrigger trigger = newTrigger().withIdentity(“trigger1”, “group1”).withSchedule(cronSchedule(“0/20 * * * * ?”)).build();
怎麼實現java簡單調用kettle我自己做好的job
怎麼實現java簡單調用kettle我自己做好的job
/**
* 本測試類慎用!!!!!!!
*
* @param args
*/
public static void main(String[] args) {
String datetime = “2014-12-19 23:20:45”;
String[] params = {“707”, datetime}; // 傳遞參數
String path = “F:\\job7.kjb”;
// runTransfer(params, path);
runJob(params, path);
// runJob();
// jbResource();
}
/**
* 運行轉換文件方法
* @param params 多個參數變量值
* @param ktrPath 轉換文件的路徑,後綴ktr
*/
public static void runTransfer(String[] params, String ktrPath) {
Trans trans = null;
try {
// // 初始化
// 轉換元對象
KettleEnvironment.init();// 初始化
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(ktrPath);
// 轉換
trans = new Trans(transMeta);
// 執行轉換
trans.execute(params);
// 等待轉換執行結束
trans.waitUntilFinished();
// 拋出異常
if (trans.getErrors() 0) {
throw new Exception(
“There are errors during transformation exception!(傳輸過程中發生異常)”);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* java 調用 kettle 的job
*
* @param jobname
* 如: String fName= “D:\\kettle\\informix_to_am_4.ktr”;
*/
public static void runJob(String[] params, String jobPath) {
try {
KettleEnvironment.init();
// jobname 是Job腳本的路徑及名稱
JobMeta jobMeta = new JobMeta(jobPath, null);
Job job = new Job(null, jobMeta);
// 向Job 腳本傳遞參數,腳本中獲取參數值:${參數名}
// job.setVariable(paraname, paravalue);
job.setVariable(“id”, params[0]);
job.setVariable(“dt”, params[1]);
job.start();
job.waitUntilFinished();
if (job.getErrors() 0) {
throw new Exception(
“There are errors during job exception!(執行job發生異常)”);
}
} catch (Exception e) {
e.printStackTrace();
}
}
用java代碼 道怎樣停止一個運行的job,我發現沒法停掉它.只能把整個進程退出才行.
把job放到一個線程中,用一個成員變量控制線程的運行
public class MyThead implements Runnable{
private boolean flag = false;
public void run() {
//while(){ 反覆執行的程序
if(flag) //flag是開關,更改flag狀態控制線程是否運行
return;
// }
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/184490.html