Quartz has two main components, Trigger and Job. To use cron-like trigger, we can use org.quartz.CronTrigger.
MyTrigger.java
package myproject; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; public class MyTrigger { public void task(String cronExpression, String[] commands) throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = new JobDetail("myJobDetail", "myJobDetailGroup", MyJob.class); JobDataMap jobDataMap = jobDetail.getJobDataMap(); jobDataMap.put("commands", commands); jobDetail.setJobDataMap(jobDataMap); CronTrigger cronTrigger = new CronTrigger("myTrigger", "myTriggerGroup"); try { CronExpression cexp = new CronExpression(cronExpression); cronTrigger.setCronExpression(cexp); } catch (Exception e) { e.printStackTrace(); } scheduler.scheduleJob(jobDetail, cronTrigger); scheduler.start(); } public static void main(String[] args) { if (!validateArgs(args)) { printUsage(); System.exit(1); } String cronExpression = args[0]; String[] commands = new String[args.length-1]; for (int i = 0; i < args.length-1; i++) { commands[i] = args[i+1]; } try { MyTrigger trigger = new MyTrigger(); trigger.task(cronExpression, commands); } catch (Exception e) { e.printStackTrace(); } } private static boolean validateArgs(String[] args) { if (args.length < 2) { return false; } return true; } private static void printUsage() { System.out.println("Usage: java MyTrigger [cron_exp] [command1] [command2] ..."); } }The jobDataMap in the code above is used to pass the data from the Trigger to a Job. In this example, the data being passed is a list of commands to be executed. MyJob.java
package myproject; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("MyJob - executing its job at " + new Date() + " by " + context.getTrigger().getName()); String[] commands = (String[]) context.getMergedJobDataMap().get("commands"); ProcessBuilder pb = new ProcessBuilder(commands); try { Process p = pb.start(); StreamGobbler outputStreamGobbler = new StreamGobbler(p.getInputStream()); StreamGobbler errorStreamGobbler = new StreamGobbler(p.getErrorStream()); outputStreamGobbler.start(); errorStreamGobbler.start(); p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } }To retrieve the jobDataMap from the Trigger, we can call context.getMergedJobDataMap(). StreamGobbler.java
package myproject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class StreamGobbler extends Thread { private InputStream is; public StreamGobbler(InputStream is) { this.is = is; } @Override public void run() { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(is)); String line = ""; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
Scheduler Control for Windows application
ReplyDelete