spring boot使用quartz定时器启动报错,但是定时器正常运行



spring boot添加quartz定时器报错但是定时器正常运行

[DEBUG] 2017-11-29 11:28:13,533 org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor - Could not find default TaskScheduler bean

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available


检查之后发现

,Spring的定时任务调度器会尝试获取一个注册过的 task scheduler来做任务调度,它会尝试通过BeanFactory.getBean的方法来获取一个注册过的scheduler bean,获取的步骤如下:

1.尝试从配置中找到一个TaskScheduler Bean

2.寻找ScheduledExecutorService Bean

3.使用默认的scheduler

前两步,如果找不到的话,就会以debug的方式抛出异常,分别是:

logger.debug("Could not find default TaskScheduler bean", ex);
logger.debug("Could not find default ScheduledExecutorService bean", ex);

所以,日志中打印出来的两个异常,根本不是什么错误信息,也不会影响定时器的使用,只不过是spring的自己打印的一些信息罢了,不过没搞明白,为什么非要用异常的方式打出来,估计是为了看这清晰点吧。也或者,这里面有一些重要的信息需要提示开发者。具体是什么原因,只能有机会进一步再去了解了。

下面贴上我的定时器代码。仅供记录参考:

package com.tt.pwp.report.quartz;

import com.tt.pwp.report.ws.client.request.PlatFormConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by Administrator on 2017/11/24 0024.
 */
@Component
@Configurable
@EnableScheduling
public class ReportDataQuartz {
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private PlatFormConfig ymlConfig;
    @Scheduled(fixedRate = 500000) // 每分5m行一次
    public void doReportOneDay() throws Exception {
        System.out.println("执行调度任务:"+new Date());
    }
//    public void doReportTwoDays() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportThereDays() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportFourDays() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportFiveDays() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportSixDays() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportOneWeek() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
//    public void doReportOneMonth() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用 Quartz 定时器并自启动的步骤如下: 1. 添加依赖:在 pom.xml 文件中添加 QuartzSpring Boot Starter 的依赖。 ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.3.2.RELEASE</version> </dependency> ``` 2. 配置定时器:在配置文件中添加 Quartz 定时器配置。 ```properties # 配置 Quartz SchedulerFactory org.quartz.scheduler.instanceName=MyQuartzScheduler org.quartz.scheduler.instanceId=AUTO # 配置线程池 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.threadPool.threadPriority=5 # 配置JobStore org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.isClustered=true # 配置数据源 org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=123456 org.quartz.dataSource.myDS.maxConnections=10 # 配置启动 org.quartz.startupHook.class=org.quartz.plugins.management.ShutdownHookPlugin org.quartz.plugin.shutdownhook.cleanShutdown=true ``` 3. 编写定时器:创建一个 Quartz 定时器 Job 类,实现 execute 方法。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 执行任务的逻辑代码 } } ``` 4. 创建定时器:在 Spring Boot 应用的启动类中创建定时器。 ```java @Configuration public class QuartzConfig { @Autowired private ApplicationContext applicationContext; @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .storeDurably() .build(); } @Bean public Trigger myTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myTrigger") .withSchedule(scheduleBuilder) .build(); } @Bean public SchedulerFactoryBean schedulerFactory() { AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); Properties properties = new Properties(); properties.setProperty("org.quartz.scheduler.instanceName", "MyQuartzScheduler"); properties.setProperty("org.quartz.scheduler.instanceId", "AUTO"); properties.setProperty("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); properties.setProperty("org.quartz.threadPool.threadCount", "5"); properties.setProperty("org.quartz.threadPool.threadPriority", "5"); properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); properties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); properties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); properties.setProperty("org.quartz.jobStore.dataSource", "myDS"); properties.setProperty("org.quartz.jobStore.isClustered", "true"); properties.setProperty("org.quartz.dataSource.myDS.driver", "com.mysql.jdbc.Driver"); properties.setProperty("org.quartz.dataSource.myDS.URL", "jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"); properties.setProperty("org.quartz.dataSource.myDS.user", "root"); properties.setProperty("org.quartz.dataSource.myDS.password", "123456"); properties.setProperty("org.quartz.dataSource.myDS.maxConnections", "10"); properties.setProperty("org.quartz.startupHook.class", "org.quartz.plugins.management.ShutdownHookPlugin"); properties.setProperty("org.quartz.plugin.shutdownhook.cleanShutdown", "true"); SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); schedulerFactory.setQuartzProperties(properties); schedulerFactory.setAutoStartup(true); schedulerFactory.setJobFactory(jobFactory); schedulerFactory.setApplicationContextSchedulerContextKey("applicationContext"); schedulerFactory.setTriggers(myTrigger()); return schedulerFactory; } } ``` 在上述代码中,创建了一个 JobDetail 对象和一个 Trigger 对象,并将它们绑定在 SchedulerFactoryBean 中。SchedulerFactoryBean 会自动启动 Quartz 定时器,并执行定时任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值