开发者社区 问答 正文

spring动态管理quartz的方法

现在系统里面的quartz是通过spring配置手动调用的,具体配置如下所示; 现在我需要做一个控制界面,手动对worker进行管理,比如手动启动某个worker,或者停止某个worker(不再继续调度)。求大神指导SchedulerFactoryBean如何对注册的worker进行控制?

<!-- 要调用的工作类 -->
     <bean id="hotModuleJob" class="com.mycom.worker.HotModuleWorkerService"></bean> 
     <!-- 定义调用对象和调用对象的方法 -->
     <bean id="hotModuleTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
         <!-- 调用的类 -->
         <property name="targetObject"> 
             <ref bean="hotModuleJob"/> 
         </property> 
         <!-- 调用类中的方法 -->
         <property name="targetMethod"> 
             <value>startTask</value> 
         </property> 
     </bean> 
     <!-- 定义触发时间 -->
     <bean id="doHotModuleTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
         <property name="jobDetail"> 
             <ref bean="hotModuleTask"/> 
         </property> 
         <!-- cron表达式 -->
         <property name="cronExpression"> 
             <value>0/30 * * * * ?</value> 
         </property> 
     </bean> 
      
      
  
      
      
      
     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  --> SchedulerFactoryBean
     <bean id="schedulerFactoryBean" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
         <property name="triggers"> 
             <list> 
                 <ref bean="doHotModuleTime"/>
             </list> 
         </property>
         <property name="startupDelay" value="180"></property> <!--系统启动后, 延迟3分钟启动调度 -->
     </bean> <span><span style="line-height:17.27272605895996px;"> </span></span>

展开
收起
a123456678 2016-03-16 15:22:39 2617 分享 版权
1 条回答
写回答
取消 提交回答
  • 核心代码:

    // 得到trigger
                CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
                    triggerName, Scheduler.DEFAULT_GROUP);
    //设置表达式
                trigger.setCronExpression(cronExpression);
    // 重置job
                scheduler.rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, trigger);
    
    /**
     * 列出在运行的触发器
     * @return
     */
     public String[] listTrigger(){
     String[] triggers = new String[]{};
     String[] triggerGroups = new String[]{};
     try {
     triggerGroups = scheduler.getTriggerGroupNames();
        for (int i = 0; i < triggerGroups.length; i++) {
           triggers = scheduler.getTriggerNames(triggerGroups[i]);
        }
     } catch (SchedulerException e) {
     e.printStackTrace();
     }    
     return triggers;
     }
    
    /**
     * 根据触发器得到表达式
     * @param triggerName
     * @return
     */
     public String takeCronByTriggerName(String triggerName){
     String cron = "";
     try {
     CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
     triggerName, Scheduler.DEFAULT_GROUP);
     cron = trigger.getCronExpression();
     } catch (SchedulerException e) {
     e.printStackTrace();
     }
     return cron;
     }
    
    /**
     * 根据触发器得到任务运行状态
     * @param triggerName
     * @return
     */
     public int takeStateByTriggerName(String triggerName){
     int state = 0 ;
     try {
     state = scheduler.getTriggerState(triggerName, Scheduler.DEFAULT_GROUP);
     } catch (SchedulerException e) {
     e.printStackTrace();
     }
     return state;
     }
    
    /**
     * 开关任务
     * @param type 1:关闭任务  2:开启任务
     * @param triggerName
     * @param cronExpression
     * @return
     */
     public boolean controlTrigger(String type,String triggerName,String cronExpression){
     boolean flag = false;
     try {
     if("1".equals(type)){
     String[] triggerGroups = new String[]{};
     triggerGroups = scheduler.getTriggerGroupNames();
        for (int i = 0; i < triggerGroups.length; i++) {
          // 停止job
          scheduler.pauseTrigger(triggerName, triggerGroups[i]);
        }
     }else{
     // 重启job
     scheduler.resumeTrigger(triggerName, Scheduler.DEFAULT_GROUP);
     }
     flag = true;
     } catch (SchedulerException e) {
     e.printStackTrace();
     } 
     return flag;
     }
    2019-07-17 19:04:01
    赞同 展开评论