这是一篇关于在spring框架中使用quarts项目的教程,刚刚在项目中完成了相关功能的实现,所以写这篇文件以记录与分享为目的,也方便自己以后需要时查询。
大概功能模块是,实现动态为多个门对象设置定时器,考虑到可能出现对同一个门进行多次定时器参数的修改,决定以一个门对应一个trigger的方式来实现配置,因为每个门都做同一个任务所以这些trigger共用一个jobdetail对象即可。
首先在spring配置文件中配置一个jobDetail对象:
<bean name="quartststTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.zk.acc.bean.QuartsTst"></property>
</bean>
由于采用动态设置trigger对象,所以在配置文件中不配置trigger对象,只配置了一个SchedulerFactoryBean,用于等下在代码中动态往这个SchedulerFactoryBean中添加trigger对象:
<bean name="txt" class= "org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton">
<property name="triggers">
<list>
<!-- 此处可以设置trigger对象,但我们默认为空 -->
</list>
</property>
</bean>
接着配置一个bean用于实现具体操作,需要将SchedulerFactoryBean对象注入
<bean id="test" class="com.zk.acc.web.AccQuartsTestAction">
<property name="scheduler" ref="txt"></property>
</bean>
这是action文件中的具体实现方法:
public String setQuarts() throws SchedulerException{
用于确保schedule对象一定要存在,
//System.out.println("appConfig.getProperty"+appConfig.getProperty("acc.doorStart"));
Resource rs = new FileSystemResource("...src/main/resources/conf/applicationContext-acc.xml");
@SuppressWarnings("deprecation")
BeanFactory factory = new XmlBeanFactory(rs);
if(scheduler==null){
scheduler = (Scheduler) factory.getBean("txt");
}
获取用户界面选择的doorid参数,多个门id用“,”分隔故:
String checkedDoorIdArr[] = ids.split(",");//被选中的门的id
String strAry[] = time1.split(":");//用于某一次批量设置的CronExpression参数
String pushTime = "0 "+strAry[1]+" "+strAry[0]+“ ”+" ? * *";
获取spring配置文件中配置的jobdetail
JobDetail jdDetail = (JobDetail) factory.getBean("quartststTask");
最后是判断schedule中trigger与动态配置trigger的流程
CronTriggerBean trigger;
for(String str:checkedDoorIdArr){//根据门的数量动态设置触发器的数量
try
{
trigger = new CronTriggerBean(); //动态设置trigger对象
JobDataMap jdMap = trigger.getJobDataMap(); //定义一个jobdatamap用于存储参数
jdMap.put("doorId", str);
trigger.setBeanName(str);
trigger.setName(str);
trigger.setGroup(Scheduler.DEFAULT_GROUP);
trigger.setJobName(jdDetail.getName());
try
{
trigger.setCronExpression(pushTime);//设置用户输入的某个门定时器执行时间
String originConExpression = trigger.getCronExpression();
System.out.println(originConExpression+"11111111111");
System.out.println(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP));
System.out.println(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length);
//Trigger str1[] = scheduler.getTriggersOfJob(jdDetail.getName(), jdDetail.getGroup());
if("".equals(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP))||scheduler.getTrigger(str, scheduler.DEFAULT_GROUP)==null){
//如果某个触发器trigger对象在schedul中不存在,也就是在这里进行新加操作
if(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length>0){//判断jobdetail对象是否已经存在在schedule中
//如果已经存在,只需要新加trigger
scheduler.scheduleJob(trigger);
}else{
//如果不存在,则需要绑定jobdetail对象到schedule中去
scheduler.scheduleJob(jdDetail,trigger);
}
//scheduler.scheduleJob(jdDetail,trigger);
//scheduler.start();
}else{//如果该trigger已经存在在schedule中的情况下(即再次对某个门从新设置触发时间的情况),就只是重置schedule中的这个trigger对象
System.out.println("triggername为"+str+"已存在!!重置该trigger");
scheduler.rescheduleJob(str, Scheduler.DEFAULT_GROUP, trigger);
System.out.println(scheduler.getTrigger(str, scheduler.DEFAULT_GROUP));
System.out.println(scheduler.getJobNames(scheduler.DEFAULT_GROUP).length);
// Trigger str1[] = scheduler.getTriggersOfJob(jdDetail.getName(), jdDetail.getGroup());
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}