水手的最终理想 2018-04-08 06:50 采纳率: 0%
浏览 2982
已采纳

求助,使用QuartzManager 动态添加任务的问题

现在可以动态添加了,但是问题是,比如设定任务5小时执行一次,但是动态添加上去之后不会立刻执行而是5小时之后在执行,目前我想让他 在添加的时候就执行一次,之后在5小时执行一次,求大佬帮助,我之前用配置文件的时候记得是可以设定的,但是用QuartzManager 管理类就不会设置了,求大佬

我的QuartzManager 类是这样的:

public class QuartzManager {

private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();  

/** 
 * @Description: 添加一个定时任务 
 *  
 * @param jobName 任务名 
 * @param jobGroupName  任务组名 
 * @param triggerName 触发器名 
 * @param triggerGroupName 触发器组名 
 * @param jobClass  任务 
 * @param cron   时间设置,参考quartz说明文档  
 */  
@SuppressWarnings({ "unchecked", "rawtypes" })  
public static boolean addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron,String group,String userId) {  
    try {  
        Scheduler sched = schedulerFactory.getScheduler();  
        // 任务名,任务组,任务执行类
        JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
        //用户的所属
        jobDetail.getJobDataMap().put("groupId", group);
        //用户的id
        jobDetail.getJobDataMap().put("userId", userId);
        // 触发器  
        TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
        // 触发器名,触发器组  
        triggerBuilder.withIdentity(triggerName, triggerGroupName);
        triggerBuilder.startNow();
        // 触发器时间设定  
        triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
        // 创建Trigger对象
        CronTrigger trigger = (CronTrigger) triggerBuilder.build();

        // 调度容器设置JobDetail和Trigger
        sched.scheduleJob(jobDetail, trigger);  

        // 启动  
        if (!sched.isShutdown()) {  
            sched.start(); 
        }  
        return !sched.isShutdown();
    } catch (Exception e) {  
        throw new RuntimeException(e);
    }  
}  

/** 
 * @Description: 修改一个任务的触发时间
 *  
 * @param jobName 
 * @param jobGroupName
 * @param triggerName 触发器名
 * @param triggerGroupName 触发器组名 
 * @param cron   时间设置,参考quartz说明文档   
 */  
public static void modifyJobTime(String jobName, 
        String jobGroupName, String triggerName, String triggerGroupName, String cron) {  
    try {  
        Scheduler sched = schedulerFactory.getScheduler();  
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
        CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);  
        if (trigger == null) {  
            System.out.println("未找到对应job");
            return;  
        }  

        String oldTime = trigger.getCronExpression();  
        if (!oldTime.equalsIgnoreCase(cron)) { 
            /** 方式一 :调用 rescheduleJob 开始 */
            // 触发器  
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组  
            triggerBuilder.withIdentity(triggerName, triggerGroupName);
            triggerBuilder.startNow();
            // 触发器时间设定  
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 创建Trigger对象
            trigger = (CronTrigger) triggerBuilder.build();
            // 方式一 :修改一个任务的触发时间
            sched.rescheduleJob(triggerKey, trigger);
            /** 方式一 :调用 rescheduleJob 结束 */

            /** 方式二:先删除,然后在创建一个新的Job  */
            //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));  
            //Class<? extends Job> jobClass = jobDetail.getJobClass();  
            //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);  
            //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); 
            /** 方式二 :先删除,然后在创建一个新的Job */
        }  
    } catch (Exception e) {  
        throw new RuntimeException(e);  
    }  
}  

/** 
 * @Description: 移除一个任务 
 *  
 * @param jobName 
 * @param jobGroupName 
 * @param triggerName 
 * @param triggerGroupName 
 */  
public static void removeJob(String jobName, String jobGroupName,  
        String triggerName, String triggerGroupName) {  
    try {  
        Scheduler sched = schedulerFactory.getScheduler();  

        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);

        sched.pauseTrigger(triggerKey);// 停止触发器  
        sched.unscheduleJob(triggerKey);// 移除触发器  
        sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务  
    } catch (Exception e) {  
        throw new RuntimeException(e);  
    }  
}  

/** 
 * @Description:启动所有定时任务 
 */  
public static void startJobs() {  
    try {  
        Scheduler sched = schedulerFactory.getScheduler();  
        sched.start();  
    } catch (Exception e) {  
        throw new RuntimeException(e);  
    }  
}  

/** 
 * @Description:关闭所有定时任务 
 */  
public static void shutdownJobs() {  
    try {  
        Scheduler sched = schedulerFactory.getScheduler();  
        if (!sched.isShutdown()) {  
            sched.shutdown();  
        }  
    } catch (Exception e) {  
        throw new RuntimeException(e);  
    }  
}  

}

添加任务的时候是通过控制器动态添加的,现在请问怎么设置添加的时候先执行一遍,而不是等时间到了在执行

  • 写回答

7条回答 默认 最新

  • disneylu 2018-04-08 07:21
    关注

    单独用simpleTrigger启动下

    <bean id="rsh_simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
        <property name="jobDetail" ref="myJobDetail" />  
        <property name="startDelay" value="500" />  
        <property name="repeatInterval" value="0" />  
        <property name="repeatCount" value="0" />  
    </bean>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥60 如何鉴定微信小程序数据被篡改过
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)