JFinal 整合Quartz

       項目中要加入調度和計劃任務等功能,因此選擇Quartz調度插件,原先都是在S2SH上整合的。如今項目用JFinal框架,不得不說JFinal框架的定製性真好,能夠本身根據項目要求進行修改,而且很節省時間。
java

        原先固然是先找有沒有JFinal的quartz插件,先是找到了JFinal-ext,裏面有一個QuartzPlugin,不過由於本身比較喜歡在代碼中配置調度,並且項目需求中的調度是實時性的,不是定死的。因此不太適用,因此在JFinal-ext的QuartzPlugin基礎上,「抄襲」了一下,下面是我本身改的mysql

QuartzPluginsql

import java.util.Properties;

import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;

import xidian.wwf.ivc.quartz.QuartzFactory;
import xidian.wwf.ivc.utils.PropertiesUtil;

import com.jfinal.plugin.IPlugin;

/**
 * Quartz插件
 * @author WWF
 */
public class QuartzPlugin implements IPlugin{
	
	
	/**默認配置文件**/
	private String config = "quartz.properties";
	
	public QuartzPlugin(){
		
	}
	
	public QuartzPlugin(String config){
		this.config = config;
	}

	@Override
	public boolean start() {
		try {
		    //加載配置文件
		    Properties props = PropertiesUtil.loadPropertyFile(config);
		    //實例化
		    QuartzFactory.sf = new StdSchedulerFactory(props);
		    //獲取Scheduler
		    Scheduler sched = QuartzFactory.sf.getScheduler();
        	    sched.start();
        	    return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public boolean stop() {
		try {
			QuartzFactory.sf.getScheduler().shutdown();
			QuartzFactory.sf = null;
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

}

QuartzFactory是我本身寫的一個開始job任務的管理類,以下數據庫

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerKey;

import xidian.wwf.ivc.utils.TimeUtil;

/**
 * QuartzFactory 
 * @author WWF
 */
public class QuartzFactory {
	
	public static SchedulerFactory sf;
	
	/**
	 * 定時開始任務
	 * @param startTime
	 * @param id
	 * @param name
	 * @param group
	 * @param jobClass
	 */
	public static void startJobOnce(String startTime, int id,String name,String group,Class<? extends Job> jobClass){
		try {
			Scheduler sched = sf.getScheduler();
			// define the job and tie it to our HelloJob class
			  JobDetail job = newJob(jobClass)
			      .withIdentity("job_"+name+"_"+id, "group_"+group+"_"+id)
			      .requestRecovery()
			      .build();
			  job.getJobDataMap().put(group+"_"+name, id);
			  // 定時執行
			  SimpleTrigger trigger = (SimpleTrigger) newTrigger()
			      .withIdentity("trigger_"+name+"_"+id, "group_"+group+"_"+id)
			      .startAt(TimeUtil.StringToDate2(startTime))
			      .build();
			  

			  sched.scheduleJob(job, trigger);
			  sched.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 中止任務
	 * @param name
	 * @param group
	 * @param id
	 */
	public static void stopJob(String name,String group,int id){
		try {
			if (sf!=null) {
				Scheduler scheduler = sf.getScheduler();
				TriggerKey triggerKey = TriggerKey.triggerKey("trigger_"+name+"_"+id,"group_"+ group+"_"+id);
				Trigger trigger = scheduler.getTrigger(triggerKey);
				if (trigger!=null) {
					scheduler.pauseTrigger(triggerKey);
					scheduler.unscheduleJob(triggerKey);
					scheduler.deleteJob(trigger.getJobKey());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



}

由於有時候服務器維護,會關閉tomcat,因此我把調度任務存入到數據庫中,能夠中斷回覆,下面是個人quartz.properties配置文件和數據庫鏈接ConnectionProvidertomcat

quartz.properties服務器

#==================================================
# 配置實例名和id  
#==================================================
org.quartz.scheduler.instanceName = myScheduler
org.quartz.scheduler.instanceId: my
org.quartz.scheduler.skipUpdateCheck: true

#==================================================
# 配置線程池  
#==================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 5
org.quartz.threadPool.threadPriority: 5

#==================================================
# 配置JobStore 
#==================================================
org.quartz.jobStore.misfireThreshold: 600000

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=my
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true

#==================================================
# 配置數據庫
#==================================================
org.quartz.dataSource.my.connectionProvider.class = QuartzConnectionProvider

QuartzConnectionProvider框架

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.quartz.utils.ConnectionProvider;

import xidian.wwf.ivc.utils.PropertiesUtil;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.plugin.druid.DruidPlugin;

/**
 * 自定義QuartzConnectionProvider
 * @author WWF
 */
public class QuartzConnectionProvider implements ConnectionProvider{
	
	private static final String DB_CONFIG="databaseConfig.properties";
	private DruidPlugin druidPlugin;

	@Override
	public Connection getConnection() throws SQLException {
		return druidPlugin.getDataSource().getConnection();
	}

	@Override
	public void initialize() throws SQLException {
		Properties properties = PropertiesUtil.loadPropertyFile(DB_CONFIG);
		druidPlugin = new DruidPlugin(
				properties.getProperty("jdbcUrl"),
				properties.getProperty("user"),
				properties.getProperty("password"),
				properties.getProperty("jdbcDriverClass"));
		// StatFilter提供JDBC層的統計信息
		druidPlugin.addFilter(new StatFilter());
		// WallFilter的功能是防護SQL注入攻擊
		WallFilter wallFilter = new WallFilter();
		wallFilter.setDbType("mysql");
		druidPlugin.addFilter(wallFilter);
		druidPlugin.start();
	}

	@Override
	public void shutdown() throws SQLException {
		druidPlugin.stop();
	}

}

QuartzConnectionProvider中使用了DruidPlugin,動態加載數據庫配置文件,數據庫更換隻須要修改數據庫配置文件便可ide

最後,新建一個TestJob測試

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

import xidian.wwf.ivc.utils.TimeUtil;

public class TestJob implements Job{
	
	public TestJob(){
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("開始時間="+TimeUtil.getTimeAll());
		try {
			//JobDataMap dataMap= arg0.getJobDetail().getJobDataMap();
			System.out.println("哇哈哈");
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("結束時間="+TimeUtil.getTimeAll());
	}
	

}

在afterJFinalStart中新建測試任務ui

//測試quartz
String startTime = "2014-03-09 09:54:00";
QuartzFactory.startJobOnce(startTime, 5, "test", "testgroup", TestJob.class);

到點了就執行TestJob了。你們還能夠根據須要,在QuartzFactory中添加間隔定時調度等,由於我項目就一個定點調度,因此基本都是執行一次便可。

寫的很差,你們勿噴!

相關文章
相關標籤/搜索