qq_33350115
qq_33350115
采纳率100%
2018-04-08 06:50

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

20
  • java
  • quartz
  • quartz 动态添加任务
已采纳

现在可以动态添加了,但是问题是,比如设定任务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 disneylu 3年前

    单独用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>
    
    点赞 评论 复制链接分享
  • qq_37461349 不喜欢吃猫的鱼 3年前

    你可以在保存定时任务的时候执行一下start()方法,
    我是这样做的,你可以参考下
    //不存在,创建一个
    if (null == trigger) {
    JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
    //按新的cronExpression表达式构建一个新的trigger
    TriggerBuilder s = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName);
    if(!firstRun){//根据传进来的配置,是否要在第一次启动的时候执行一次
    s.startAt(DateUtil.addSecond(new Date(),time));
    }
    trigger = (SimpleTrigger) s.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build();
    scheduler.scheduleJob(jobDetail, trigger);
    //启动
    if (!scheduler.isShutdown())
    scheduler.start();
    } else {
    // Trigger已存在,那么更新相应的定时设置
    //按新的cronExpression表达式重新构建trigger
    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build();
    //按新的trigger重新设置job执行
    scheduler.rescheduleJob(triggerKey, trigger);
    }

    点赞 1 评论 复制链接分享
  • u010427387 瞳孔里的阳光 3年前

    获取需要启动任务的Scheduler类,调用start()方法不能启动么?

    点赞 1 评论 复制链接分享
  • qq_33350115 qq_33350115 3年前

    找到原因了,我用的触发器是TriggerBuilder,但是他这个并不能设定增加任务时候就执行一遍,需要完成这个的话,得用简单的触发器,SimpleScheduleBuilder,这样的话startNow()方法才会有作用。

    点赞 评论 复制链接分享
  • cc_ll cc_ll 3年前

    spring中Object bean = applicationContext.getBean(jobClass); ((Job)bean).execute(context);

    点赞 评论 复制链接分享
  • qq_36345313 s石 3年前

    直接((Job)JobClass.newInstance()).execute(context)
    或者从spring中Object bean = applicationContext.getBean(jobClass); ((Job)bean).execute(context);

    点赞 评论 复制链接分享
  • w172087242 little_how 3年前

    趁着放假这几天写了一个定时任务管理系统;
    里面的类型fixed就是不延迟直接触发的任务;
    你可以看下我的博客,博客里面有代码的github地址
    博客链接:https://blog.csdn.net/w172087242/article/details/79847998

    希望对你有帮助....

    点赞 评论 复制链接分享

为你推荐