当前位置: 代码迷 >> Java Web开发 >> spring+quartz 定时任务无法执行,请大神帮忙见见
  详细解决方案

spring+quartz 定时任务无法执行,请大神帮忙见见

热度:765   发布时间:2016-04-13 22:15:36.0
spring+quartz 定时任务无法执行,请大神帮忙看看
项目中的定时任务无法启动,创建任务时是正常的,但是到了执行的时间,任务没有一点反应
东西是照着我之前的一个工程搬过来的,上一个项目没有问题
照着这个帖子处理的http://www.meiriyouke.net/?p=131

spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- SpringBean切面监控 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
</beans>


加载scheduler
private Scheduler scheduler;
private Scheduler getScheduler(){
if(scheduler == null){
scheduler = (Scheduler)SpringBeanLoader.getSpringBean("schedulerFactoryBean");
}
return scheduler;
}


创建任务
private void jobCreate(Dto dto, CronTrigger cronTrigger) throws Exception{
Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(dto.getAsString("jobclass"));
        //不存在,创建一个
        if (cronTrigger == null) {
         ScheduleUtils.createScheduleJob(getScheduler(), dto, jobClass);
        } else {
            //已存在
         return;
        }
}


public static void createScheduleJob(Scheduler scheduler, Dto dto, 
     Class<? extends Job> jobClass) throws SchedulerException {
        //构建job信息
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(
         dto.getAsString("schedulerid"), dto.getAsString("companyid")).build();
        
        //放入参数,运行时的方法可以获取
        jobDetail.getJobDataMap().put(JOB_PARAM_KEY, dto);

        //表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(dto.getAsString("cronexpression"));

        //按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(dto.getAsString("schedulerid"), dto.getAsString("companyid"))
            .withSchedule(scheduleBuilder).build();

        scheduler.scheduleJob(jobDetail, trigger);
    }



------解决思路----------------------
看看这个呢。/  
------解决思路----------------------
我现在做的一个轮询,你参考:

spring配置:
<!-- quartz-2.x的配置 -->
    <bean name="startQuertz" lazy-init="false" autowire="no"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="BidTaskManagerJobTrigger"/>
                <!--<ref bean="demoJobTrigger"/>-->
                <ref bean="payTaskTrigger"/>
            </list>
        </property>
    </bean>
    <bean id="payTaskTrigger"
          class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="payTaskDetail"/>
        </property>
        <property name="cronExpression">
            <value>0 0 0/2 * * ?</value><!-- 0/5 * * * * ? -->
        </property>
    </bean>
    <!-- 调度的配置结束 -->

<bean id="payTaskDetail"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="concurrent" value="false"/>
        <property name="targetObject">
            <ref bean="payEndTask"/>
        </property>
        <property name="targetMethod">
            <value>excuteUpdate</value>
        </property>
    </bean>

<!-- 轮询task类 -->
<bean id="payEndTask" class="com.cq2022.zago.schedule.task.UpdateSchedulePayEndDateTask"></bean>


java代码:
public class UpdateSchedulePayEndDateTask implements Serializable{

private static final long serialVersionUID = 1L;

private static final Logger logger = LoggerFactory.getLogger(UpdateSchedulePayEndDateTask.class);

@Resource
private MeetingScheduleService meetingScheduleService;

public void excuteUpdate(){
logger.info("启动轮询:查询出所有付款截止时间小于当前时间的会议集合,并修改成取消");
meetingScheduleService.releaseSchdlByPayDateEnd();//这里是业务操作
}

}


很简单~  
------解决思路----------------------
直接 task注解扫描。 
<task:annotation-driven/>  



@Scheduled(cron = "*/5 * * * * ?")
//@Scheduled(fixedDelay = 5000)
public void demoServiceMethod() {
System.out.println("Method executed at every 5 seconds. Current time is :: " + (new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()));

}

------解决思路----------------------
http://yangpanwww.iteye.com/blog/797563
看一下这个
  相关解决方案