以SpringMVC框架為中心瘋狂擴充套件-13、quartz持久化
阿新 • • 發佈:2018-12-26
為了更靈活的使用quartz的功能,持久化job和trigger是非常有必要的。
1、quartz記憶體方式和持久化方式的對比
優點 | 缺點 | |
記憶體方式 | 實現簡單 | 配置不夠靈活、不方便服務的擴充(叢集)、不能再中斷後恢復 |
持久化方式 | 持久化的缺點 | 速度相對記憶體方式會慢一點 |
2、spring-quartz-db.xml
3、重寫jobFactory<?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>
4、建立工作類/** * 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; } }
5、到這一步基本上就完成了,現在資料庫裡面沒有存job和trigger。編寫一個業務邏輯來建立job和trigger。/** * 任務 * * @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(); } }
/**
* 控制器
*
* @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";
}
}