spring中使用quarts实现任务定制与管理

   这是一篇关于在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();
            }
            
        }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值