spring quatz动态设置定时任务时报错,
配置文件:<bean id="testAction"
class="com.huapu.lpmis.web.action.jobinfo.JobTest">
<property name="scheduler" ref="schedulerFactory" />
<property name="jobInfoService" ref="jobInfoService" />
</bean>
<bean id="schedulerJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testAction" />
<property name="targetMethod" value="reScheduleTestJob" />
<property name="concurrent" value="false" />
</bean>
<bean id="jobTestTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="schedulerJobDetail" />
<property name="cronExpression">
<value>0/10 * * * * ?</value>
</property>
</bean>
<bean id="schedulerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="jobTestTrigger" />
</list>
</property>
</bean>代码:private Scheduler scheduler;
private JobInfoServiceIface jobInfoService;
public Scheduler getScheduler() {
return scheduler;
}
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public JobInfoServiceIface getJobInfoService() {
return jobInfoService;
}
public void setJobInfoService(JobInfoServiceIface jobInfoService) {
this.jobInfoService = jobInfoService;
}
public void reScheduleTestJob() throws SchedulerException, ParseException{
//  运行时可通过动态注入的scheduler得到trigger
        CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
                "jobTestTrigger", "aa");
        String dbCronExpression = getCronExpressionFromDB();
        String originConExpression = trigger.getCronExpression();
    // 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等
    // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
        if(!originConExpression.equalsIgnoreCase(dbCronExpression)){
            trigger.setCronExpression(dbCronExpression);
            scheduler.rescheduleJob("jobTestTrigger", Scheduler.DEFAULT_GROUP, trigger);
        }
    // 下面是具体的job内容,可自行设置
     excuteJobDetail();

}
private String getCronExpressionFromDB() {
DetachedCriteria detachedCriteria = DetachedCriteria
.forClass(JobDetail.class);
detachedCriteria.addOrder(Order.asc("CreateTime"));
//暂时不知道得到的是什么
detachedCriteria.add(Restrictions.eq("Id", "aa"));
// List jobDetailList = jobInfoService.queryJobInfo(detachedCriteria);

JobInfo jobInfo = new JobInfo();
jobInfo = jobInfoService.getJobInfoById("aa");
// jobInfo = (JobInfo)jobDetailList.get(0);
String dbCronExpression = jobInfo.getCronExpression();
return dbCronExpression;
}
public void excuteJobDetail(){
System.out.println("Ha, This is my job");
System.out.println("You are welcome!!!!!! The time is"+ new Date());
}报错位置:
//  运行时可通过动态注入的scheduler得到trigger
        CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
                "jobTestTrigger", "aa");报错如下:
[lpmis] DEBUG [DefaultQuartzScheduler_QuartzSchedulerThread] SimpleJobFactory.newJob(46) | Producing instance of Job 'DEFAULT.schedulerJobDetail', class=org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$StatefulMethodInvokingJob
[lpmis] DEBUG [DefaultQuartzScheduler_Worker-8] JobRunShell.run(194) | Calling execute on job DEFAULT.schedulerJobDetail
[lpmis] WARN [DefaultQuartzScheduler_Worker-8] MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(168) | Could not invoke method 'reScheduleTestJob' on target object [com.huapu.lpmis.web.action.jobinfo.JobTest@109506a]
java.lang.ClassCastException: org.springframework.scheduling.quartz.CronTriggerBean
at com.huapu.lpmis.web.action.jobinfo.JobTest.reScheduleTestJob(JobTest.java:39)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
at org.quartz.core.JobRunShell.run(JobRunShell.java:195)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
[lpmis] INFO [DefaultQuartzScheduler_Worker-8] JobRunShell.run(200) | Job DEFAULT.schedulerJobDetail threw a JobExecutionException: 
org.quartz.JobExecutionException: Could not invoke method 'reScheduleTestJob' on target object [com.huapu.lpmis.web.action.jobinfo.JobTest@109506a] [See nested exception: java.lang.ClassCastException: org.springframework.scheduling.quartz.CronTriggerBean]
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:174)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
at org.quartz.core.JobRunShell.run(JobRunShell.java:195)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
* Nested Exception (Underlying Cause) ---------------
java.lang.ClassCastException: org.springframework.scheduling.quartz.CronTriggerBean
at com.huapu.lpmis.web.action.jobinfo.JobTest.reScheduleTestJob(JobTest.java:39)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
at org.quartz.core.JobRunShell.run(JobRunShell.java:195)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)折腾了半天,没找到错误原因,请大家帮忙看看,谢啦!!!

解决方案 »

  1.   

    应该是你指定的group没有找到:
    CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
                    "jobTestTrigger", "aa"); => 
    CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
                    "jobTestTrigger", Scheduler.DEFAULT_GROUP); 
      

  2.   

    不好意思,这个是我改过以后的。因为用这个:CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger( 
                    "jobTestTrigger", Scheduler.DEFAULT_GROUP)报上面那个错,所以我临时改了个“aa”,实际上我没有特意设置group,请大家帮我研究研究,谢谢
      

  3.   

    找到原因了。为了方便看代码,我在同一包下重写了一个CronTriggerBean文件 ,里面代码和spring里的CronTriggerBean 一摸一样。实际转换的时候用的自己写的这个就出错了。改成spring里的就解决了。但是有个疑问,不知道为什么重写的转换就会出问题,里面的内容是一样的,完全没有改动过。谢谢1楼!