•  

jfinal中集成quartz框架,实现傻瓜式调用

2017-12-09

quartz是一个非常牛B的调度框架,原生使用比较繁琐复杂,需要写很多东西,以前也用过spring集成quartz,那是非常难受。看看这个jfinal是如何简单。


我这里quartz框架版本使用的是

quartz-2.2.1.jar

quartz-jobs-2.2.1.jar


1、写一个辅助工具类,用来获取配置文件

package com.sl.basic.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;

/**
 * 原来是自己写的,但是jfinal 也提供了,那么就用jfinal的了 b
 * 
 * @Description:
 * @Copyright: Copyright 2014 ShenZhen SL Corporation
 * @Company: 深圳市东深电子股份有限公司
 * @Author :jiangfl
 * @Date: 2016-1-7
 * @Version 1.0
 */
@SuppressWarnings("serial")
public class SLLoadConfig{

	private static Map<String, Long> fileModifyMap = new HashMap<String, Long>();

	/***************************************************************************
	 * 获取默认配置文件(SLConstants.DEFAULT_FILE_NAME)key对应的val值 (加载的值保存到内存中)
	 * 
	 * @param key
	 * @return
	 * @author jiangfl
	 * @2014-3-28
	 */
	public static Boolean getValToBoolean(String key) {
		return Boolean.valueOf(getVal(key));
	}

	public static Integer getValToInteger(String key) {
		return Integer.valueOf(getVal(key));
	}

	/***************************************************************************
	 * 
	 * @desc 获取默认配置文件(SLConstants.DEFAULT_FILE_NAME)key对应的val值
	 * @author jiangfl
	 * @2014-3-1
	 * @param key
	 * @param saveMemory
	 *            加载的数据是否保存到内存中
	 * @return
	 */
	public static String getVal(String key) {
		return getVal(key, SLConstants.Properties.DEFAULT);
	}

	/***************************************************************************
	 * 
	 * @desc 获取配置文件key对应的value 值
	 * @author jiangfl
	 * @2014-3-1
	 * @param key
	 *            key
	 * @param fileName
	 *            文件名称
	 * @param saveMemory
	 *            加载的值是否保存到内存中
	 * @return
	 */
	public static String getVal(String key, String fileName) {
		Long lastModify = fileModifyMap.get(fileName);
		Long fileLastTime = new File(SLLoadConfig.class.getResource("/").getPath() + "/" + fileName).lastModified();
		if (lastModify == null) {// 第一次
			fileModifyMap.put(fileName, fileLastTime);
		} else if (lastModify != fileLastTime) {
			// 先移除
			PropKit.useless(fileName);
		}
		return PropKit.use(fileName).get(key);
	}

	public static Integer getValToInteger(String key, String fileName) {
		return Integer.valueOf(getVal(key, fileName).trim());
	}

	public static Long getValToLong(String key, String fileName) {
		return Long.valueOf(getVal(key, fileName).trim());
	}
	/***************************************************************************
	 * 
	 * @desc 装在配置到 Properties对象中
	 * @author jiangfl
	 * @2014-3-1
	 * @param filename
	 *            配置文件名称
	 * @param saveMemory
	 *            数据是否保存到内存中, 如果保存到内存中,加载一次后,无需再次加载配置,直接从内存中读取
	 * @return
	 */
	public static Properties loadFile(String filename) {
		return new Prop(filename).getProperties();
	}

	public static void main(String[] args) {
		System.out.println(SLLoadConfig.getVal("devMode"));
	}
}


2、定义SLQuartz插件

package com.sl.basic.jfinal.plugin;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import com.jfinal.plugin.IPlugin;
import com.sl.basic.util.SLLoadConfig;

/**
 * 
 * @desc quartz封装类 被调度的类只要实现接口  org.quartz.Job 接口中execute方法即可
 * @2017-4-4
 * @author jiangfl
 * @Copyright:Copyright ShenZhen SL Software Corporation
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class SLQuartz implements IPlugin {

	// 通过schedulerFactory获取一个调度器
	private SchedulerFactory schedulerfactory = new StdSchedulerFactory();

	private Map<Class, String> map = new HashMap<Class, String>();

	
	public SLQuartz addScheduler(Class cls, String cronKey) {
		map.put(cls, cronKey);
		return this;
	}

	@Override
	public boolean start() {
		try {
			Iterator<Class> iter = map.keySet().iterator();
			Class cls;
			while (iter.hasNext()) {
				cls = iter.next();
				String name = cls.getName()+"_"+UUID.randomUUID().toString();
				Scheduler scheduler = schedulerfactory.getScheduler();
				// 创建jobDetail实例,绑定Job实现类
				// 指明job的名称,所在组的名称,以及绑定job类
				JobDetail job = JobBuilder.newJob(cls).withIdentity("job_" + name, "jgroup_" + name).build();

				// 使用cornTrigger规则
				Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_" + name, "triggerGroup_" + name)
						.withSchedule(CronScheduleBuilder.cronSchedule(SLLoadConfig.getVal(map.get(cls), "com/properties/quartz/quartz.properties"))).startNow().build();

				// 把作业和触发器注册到任务调度中
				scheduler.scheduleJob(job, trigger);

				// 启动调度
				scheduler.start();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return true;
	}

	@Override
	public boolean stop() {
		return true;
	}

}


3、编写作业类,用来执行任务,编写一个普通类,实现org.quartz.Job 接口就行了,比如我这里的业务类

package com.sl.app.mail.service;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * Created by long on 2017/5/20.
 */
public class JobTest  implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        
        System.out.println("执行调度任务");
        
    }
}



4、我们把调度时间写到配置里面去,以后就只需要更改配置了配置文件为  src\com\properties\quartz\quartz.properties

内容为:

#启用调度 

enableQuartz=true
#每楁分钟 
m1=0 */1 * * * ? 
#每楅秒 
s5=*/5 * * * * ? 
#工作流自动执行任务 
activityAutoTask=*/50 * * * * ? 
#凌晨执行 0 0 23 * * ? 
day01=0 0 23 * * ?


5、启动任务

//在任一代码中执行

new SLQuartz().addScheduler(JobTest.class, "day01").start();

// 这里会根据day01加载配置文件的值 0 0 23 * * ? 然后执行JobTest类中的execute()方法,是不是非常简单呢!


//在jfinal配置类configPlugin方法执行

public void configPlugin(Plugins me) {
  me.add(new SLQuartz().addScheduler(JobTest.class, "day01"));
}

插件写好后,其实以后只需要3部就可以了

1)编写实现Job接口的实现类,如JobTest

2)添加时间调度配置 如在quartz.properties中的day01=0 0 23 * * ?

3)启动调度   new SLQuartz().addScheduler(JobTest.class, "day01").start(),或者在configPlugin方法中添加启动


申明:本文受法律保护,未经作者同意不得用于商业用途,如转载请说明出处!
评论