JobUtil.createJob(String jobName,String triggerName,String runTime) 封装创建任务的工具,第一个参数任务名称(唯一),第二个参数触发器名称(唯一),最后一个参数是任务运行时间,参考quartz写法。
实现思路:
GroovyJob 类是任务调度类,里面是groovy脚本执行引擎。不管脚本存在数据库里或者不使用grooy直接写业务都是可以的。工具类中的
createJob方法,是实现启动创建任务的方法,用户可以设置任务的名称(创建多个任务必须具有不同的名称),可以设置触发执行的时间。不通方法之间的参数交互,包括groovy脚本与系统的参数交互请查阅相关文档。
工具类:
/**
*
* @param jobName 任务名称(唯一)
* @param triggerName 触发器名称(唯一)
* @param runTime 执行时间,参考quartz写法
* @param map 传递给任务类的参数
* @throws SchedulerException
*/
public static void createJob(String jobName, String triggerName, String runTime,Map<String,String> map) throws SchedulerException {
JobDetail jb = JobBuilder.newJob(GroovyJob.class)
.withDescription("this is a ram job") //job的描述
.withIdentity(jobName, "ramGroup") //job 的name和group
.build();
long time = System.currentTimeMillis() + 3 * 1000L; //3秒后启动任务
Date statTime = new Date(time);
Set<String> keySet = map.keySet();
if(keySet!=null)
for(String key:keySet){
jb.getJobDataMap().put(key, map.get(key));
}
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity(triggerName, "ramTriggerGroup")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.startAt(statTime) //默认当前时间启动,下面的用到了Quartz表达式:http://cron.qqe2.com/
.withSchedule(CronScheduleBuilder.cronSchedule(runTime)) //两秒执行一次
.build();
//5.注册任务和定时器
scheduler.scheduleJob(jb, t);
//6.启动 调度器
scheduler.start();
}
任务类:
public class GroovyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
String id = context.getJobDetail().getKey().getName();
Binding binding = new Binding();
binding.setVariable("x", 10);
binding.setVariable("language", id);
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate("println \"Welcome to $language\"; y = x * 2; z = x * 3; return x ");
shell.evaluate(JobUtil.runContext);
System.err.println(value +", " + value.equals(10));
System.err.println(binding.getVariable("y") +", " + binding.getVariable("y").equals(20));
System.err.println(binding.getVariable("z") +", " + binding.getVariable("z").equals(30));
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String strData = dataMap.getString("xxxxxxxxxxxxxxx");
System.out.println(strData);
}
}
欢迎大牛来吐槽,废话不多说,直接上代码:https://github.com/cadota/grovvyJobStudy