1. 程式人生 > >以SpringMVC框架為中心瘋狂擴充套件-13、quartz持久化

以SpringMVC框架為中心瘋狂擴充套件-13、quartz持久化

為了更靈活的使用quartz的功能,持久化job和trigger是非常有必要的。

1、quartz記憶體方式和持久化方式的對比

優點 缺點
記憶體方式 實現簡單 配置不夠靈活、不方便服務的擴充(叢集)、不能再中斷後恢復
持久化方式 持久化的缺點 速度相對記憶體方式會慢一點

2、spring-quartz-db.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">

	<!-- 啟動觸發器的配置開始 -->
	<bean name="startQuertz" lazy-init="false" autowire="no"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<!-- 資料連線 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 排程名稱,會被記錄到資料庫 -->
		<property name="schedulerName" value="myscheduler" />
		<!-- quartz配置資訊 -->
		<property name="configLocation" value="classpath:config/quartz.properties"/>
		<!--applicationContextSchedulerContextKey: 
			是org.springframework.scheduling.quartz.SchedulerFactoryBean這個類中把spring上下文
			以key/value的方式存放在了quartz的上下文中了,
			可以用applicationContextSchedulerContextKey所定義的key得到對應的spring上下文
		-->  
		<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
		<!-- 是否自動啟動 -->
		<property name="autoStartup" value="true" />
		<!-- 配置job工廠 -->
		<property name="jobFactory" ref="jobFactory" />
	</bean>
	<!-- 啟動觸發器的配置結束 -->
	
	<!--job工廠、如果需要使用spring的bean注入到job就需要重寫一個jobfactory-->  
    <bean id="jobFactory"  class="com.syx.quartz.MyJobFactory"/>  
	
	<!-- 作業服務類 -->
	<bean id="myJob" class="com.syx.quartz.MyJob" />
</beans>
3、重寫jobFactory
/** 
 * Job工廠
 * 預設的job工廠方式不能實現springbean的注入,因為quartz在spring之前初始化 
 *
 * @author sunyx 
 * @since JDK 1.8 
 */
public class MyJobFactory extends SpringBeanJobFactory {
	
	@Autowired
    private AutowireCapableBeanFactory beanFactory;

    /*
     * 重寫SpringBeanJobFactory的createJobInstance方法,對其創建出來的類再進行autowire。
     * @see org.springframework.scheduling.quartz.SpringBeanJobFactory#createJobInstance(org.quartz.spi.TriggerFiredBundle) 
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        final Object jobInstance = super.createJobInstance(bundle);
        beanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
4、建立工作類
/** 
 * 任務
 *
 * @author sunyx 
 * @since JDK 1.8 
 */
public class MyJob implements Job{
	
	@Autowired
	private UserMapper userMapper;
	
	public void worksyx() {  
		final UserModel model = userMapper.findUserById("1");
        System.out.println("date:" + new Date().toString()+";user:"+model.getName());  
    }

	public void execute(JobExecutionContext context) throws JobExecutionException {
		final JobDataMap dataMap= context.getJobDetail().getJobDataMap();
		final String table = dataMap.getString("table");
		System.out.println("table:"+table);
		this.worksyx();
		
	}
}
5、到這一步基本上就完成了,現在資料庫裡面沒有存job和trigger。編寫一個業務邏輯來建立job和trigger。
/** 
 * 控制器
 *
 * @author sunyx 
 * @since JDK 1.8 
 */  
@Controller
public class SchedulerController {
	
	private final boolean init = false;
	
	@Autowired
	private JobService jobService;
	
	/**    
	 * 主頁面
	 *
	 * @author sunyx 
	 * @param request
	 * @return 
	 * @since JDK 1.8  
	 */ 
	@RequestMapping("/show")
	public String show(HttpServletRequest request){		
		final List<PageTrigger> triggers = jobService.getTriggersInfo();
<span style="white-space:pre">		</span>request.setAttribute("triggers", triggers);
	}
	
	/**    
	 * 新增一個任務 
	 *
	 * @author sunyx 
	 * @param request
	 * @return 
	 * @since JDK 1.8  
	 */ 
	@RequestMapping("/add")
	public String add(HttpServletRequest request){
		try {
			jobService.addJob();
		} catch (final SchedulerException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
		return "redirect:/show";
	}
}