`
rensanning
  • 浏览: 3547978 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38135
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607268
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682257
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89320
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401821
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69685
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91693
社区版块
存档分类
最新评论

Spring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled)

 
阅读更多
主要用于定时发送邮件、夜间自动维护等。

(1)开启定时任务功能
@Configuration
@EnableScheduling
public class SpringTaskScheduleConfig {
    @Bean
    public TaskScheduler poolScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("poolScheduler");
        scheduler.setPoolSize(10);
        return scheduler;
    }
}

*** Spring4只允许定义一个TaskScheduler。

(2)定义定时任务

1)@Scheduled注解
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomeTask(){
}

@Scheduled(fixedDelay = 2000)
public void fixedDelayJob() {
}

@Scheduled(fixedRate = 2000)
public void fixedRateJob() {
}

  • Cron – 自由指定时间
  • FixedRate – 开始后计时
  • FixedDelay – 完成后计时

2)实现SchedulingConfigurer
@Configuration
public class MySchedulingConfigurer implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(poolScheduler());
        // add job
        taskRegistrar.addFixedRateTask(new IntervalTask(
            new Runnable() {
                @Override
                public void run() {
                    System.out.println("Job @ fixed rate " + new Date() + ", Thread name is " + Thread.currentThread().getName());
                }
            },
            1000, 0));
    }
    
    @Bean
    public TaskScheduler poolScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("poolScheduler");
        scheduler.setPoolSize(10);
        return scheduler;
    }

}


3)动态定义
TaskScheduler(ThreadPoolTaskScheduler)、Trigger(CronTrigger、PeriodicTrigger)。
ThreadPoolTaskScheduler scheduler = (ThreadPoolTaskScheduler) appContext.getBean("scheduler");
CronTrigger trigger = new CronTrigger("0 0/5 * * * ?"); // Every 5 minutes
ScheduledFuture<Object> scedulefuture = scheduler.schedule(taskObject, trigger);


(3)规则定义到配置文件

application.properties
引用
cron.expression=0 0 0/1 * * ?
task.exec.time.delayed=5000

@Scheduled(cron = "${cron.expression}")
public void demoServiceMethod() {
}

@Scheduled(fixedDelayString = "${task.exec.time.delayed}")
public void autoProcess() {
}


(4)集群下的定时任务

1)通过AOP拦截限定定时任务的启动
多服务器的时候,不能所有服务器都同时执行定时任务,最简单的方法是只让特殊的服务才执行执行定时任务。

application.properties
引用
batch.exec.host=192.168.1.100

@Aspect
@Component
public class TaskInterceptor {
  @Value(“${batch.exec.host}”) String batchExecHost;

  @Around("execution(* com.rensanning.task..*.*(..)) && @annotation(org.springframework.scheduling.annotation.Scheduled)")
  public Object around(ProceedingJoinPoint pjp) throws Throwable {
    String methodName = pjp.getSignature().getName();
    String currentThread = Thread.currentThread().getName();
    if (!allowedBatchExec()) {
      log.info("Skip batch ({}): {}", currentThread, methodName);
      return null;
    }
    log.info("Begin batch ({}): {}", currentThread, methodName);
    Stopwatch stopWatch = Stopwatch.createStarted();
    try {
      return pjp.proceed();
    } catch (Exception e) {
      log.error("batch error: {}", methodName, e);
      return null;
    } finally {
      log.info("End batch ({}): {}, elapsed = {} (ms)", currentThread, methodName,
      stopWatch.elapsed(TimeUnit.MILLISECONDS));
    }
  }

  private boolean allowedBatchExec() {
    if (getHostName().equals(batchExecHost)) {
      return true;
    }
    return false;
  }
}


2)集成Quartz Scheduler
Quartz的集群方案是基于数据库的,与Spring无缝对接。

a)导入jar
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.3</version>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.2.3</version>
</dependency>


b)将Quartz所需的表Schema导入数据库
从 http://www.quartz-scheduler.org/downloads/ 下载quartz-2.2.3-distribution.tar.gz后,quartz-2.2.3-distribution.tar.gz\quartz-2.2.3\docs\dbTables\ 里边有表结构定义DDL,大概11个表。

c)配置Quartz
@Configuration
public class ConfigureQuartz {
	
	@Bean
	public SpringBeanJobFactory jobFactory(ApplicationContext applicationContext) {
	    AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
	    jobFactory.setApplicationContext(applicationContext);
	    return jobFactory;
	}
	
	@Bean
	public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory,
			@Qualifier("sampleJob1Trigger") Trigger trigger1,
			@Qualifier("sampleJob2Trigger") Trigger trigger2) throws IOException {
		SchedulerFactoryBean factory = new SchedulerFactoryBean();
		factory.setOverwriteExistingJobs(true);
		factory.setAutoStartup(true);
		factory.setStartupDelay(20);
		factory.setJobFactory(jobFactory);
		factory.setQuartzProperties(quartzProperties());
		factory.setTriggers(trigger1, trigger2);
		return factory;
	}

    @Bean(name = "sampleJob1Detail")
    public JobDetailFactoryBean sampleJob1Detail() {
        return createJobDetail(SampleJob1.class);
    }

    @Bean(name = "sampleJob2Detail")
    public JobDetailFactoryBean sampleJob2Detail() {
        return createJobDetail(SampleJob2.class);
    }

    @Bean(name = "sampleJob1Trigger")
    public CronTriggerFactoryBean sampleJob1Trigger(@Qualifier("sampleJob1Detail") JobDetail jobDetail,
    		@Value("${cron.job1.expression}") String job1CronExp) {
        return createCronTrigger(jobDetail, job1CronExp);
    }

    @Bean(name = "sampleJob2Trigger")
    public CronTriggerFactoryBean sampleJob2Trigger(@Qualifier("sampleJob2Detail") JobDetail jobDetail,
    		@Value("${cron.job2.expression}") String job2CronExp) {
        return createCronTrigger(jobDetail, job2CronExp);
    }
	
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
	
    private JobDetailFactoryBean createJobDetail(Class<?> jobClass) {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        factoryBean.setJobClass(jobClass);
        factoryBean.setDurability(true);
        return factoryBean;
    }
	
    private CronTriggerFactoryBean createCronTrigger(JobDetail jobDetail, String cronExpression) {
        CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setCronExpression(cronExpression);
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
        return factoryBean;
    }
	
}

public class AutoWiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

quartz properties
引用
org.quartz.scheduler.instanceName=ClusteredScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.makeSchedulerThreadDaemon=true
org.quartz.scheduler.skipUpdateCheck=true

org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.makeThreadsDaemons=true
org.quartz.threadPool.threadCount=20
org.quartz.threadPool.threadPriority=5

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.misfireThreshold=25000

org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000

org.quartz.dataSource.myDS.driver=org.postgresql.Driver
org.quartz.dataSource.myDS.URL=jdbc:postgresql://localhost:5432/test
org.quartz.dataSource.myDS.user=postgres
org.quartz.dataSource.myDS.password=postgres
org.quartz.dataSource.myDS.maxConnections=5
org.quartz.dataSource.myDS.validationQuery=select 1

application.properties
引用
cron.job1.expression=0 0/3 * * * ?
cron.job2.expression=0 0/5 * * * ?


c)定义Job

基于org.quartz.Job
@Component
@DisallowConcurrentExecution
public class SampleJob1 implements Job {
 
    @Autowired
    private SampleJobService jobService;
 
    public void execute(JobExecutionContext context) throws JobExecutionException {
        jobService.executeSampleJob1();
    }
}


基于org.springframework.scheduling.quartz.QuartzJobBean
@Component
@DisallowConcurrentExecution
public class SampleJob2 extends QuartzJobBean {
 
    @Autowired
    private SampleJobService jobService;

    @Override
    protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
        jobService.executeSampleJob2();
    }

}


@Service
public class SampleJobService {

	public void executeSampleJob1() {
		System.out.println(" hello job 1. ");
	}

	public void executeSampleJob2() {
		System.out.println(" hello job 2. ");
	}

}
分享到:
评论

相关推荐

    spring-boot-samples-master

    9. **定时任务**:"spring-boot-sample-task"演示了Spring Boot中如何配置和执行定时任务,包括使用@Scheduled注解。 通过这些示例,开发者可以了解Spring Boot在实际开发中的应用方式,从基础到高级,从简单到复杂...

    Spring定时任务@Scheduled例子

    `@Scheduled`注解是Spring提供的一个强大工具,用于声明式地配置定时任务,无需编写复杂的线程管理和调度逻辑。在这个例子中,我们将深入探讨`@Scheduled`的用法以及与之相关的`task:scheduler`和`task:executor`。 ...

    spring-boot-scheduled-task.zip

    这个名为"spring-boot-scheduled-task.zip"的压缩包很可能包含了一个完整的Spring Boot项目,用于演示或实践如何配置和使用Spring Boot的定时任务功能。在这个项目中,我们可以预期看到以下几个关键知识点: 1. **...

    spring boot @scheduled定时任务配置

    在Spring Boot框架中,`@Scheduled`注解是用于创建定时任务的重要工具,它使得开发者无需依赖外部的任务调度器如Quartz或CronJob,就能在应用内部轻松地实现周期性的任务执行。这个特性极大地简化了Java应用中的定时...

    spring-boot-scheduled3.zip

    总之,"spring-boot-scheduled3.zip"这个案例通过Spring Boot和Quartz的集成,展示了如何在Java环境中创建和管理定时任务。这不仅有助于实现复杂的定时任务逻辑,还可以方便地扩展和调整任务执行策略,是企业级应用...

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    ### Spring Boot中的@Scheduled注解:定时任务的原理与实现 #### 一、引言 在现代软件开发中,定时任务是一种非常常见的需求。无论是数据同步、定期清理缓存还是发送提醒邮件,都需要应用程序能够在特定的时间点...

    spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法

    "spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法" Spring Boot 中的定时任务是通过 @Scheduled 注解来实现的,该注解可以将方法标记为定时任务,Spring Boot 会自动发现并执行这些方法。@...

    spring-boot-scheduled.zip

    在Spring Boot应用中,我们可以利用其内置的Spring Scheduler框架来执行定时任务,无需引入像Quartz这样的第三方库。本案例将深入探讨如何使用Spring Boot的`@Scheduled`注解来创建和管理简单任务。 首先,我们需要...

    Spring Boot 通过web开启和关闭定时任务

    首先,我们需要引入`spring-boot-starter-quartz`或者`spring-boot-starter-scheduled`依赖来启用Spring Boot的定时任务支持。Quartz是更强大的任务调度库,而`@Scheduled`注解则是Spring框架自带的简单定时任务解决...

    springboot定时任务的动态开启关闭

    本篇文章将深入探讨如何在Spring Boot中实现定时任务的动态开启和关闭。 首先,我们需要引入Spring Boot的`spring-boot-starter-quartz`或者`spring-boot-starter-task`依赖,这两个都是Spring框架提供的定时任务...

    IDEA使用springboot自带scheduled实现任务调度

    在Java开发领域,Spring Boot框架以其便捷的特性深受开发者喜爱,而Spring Boot集成的Scheduled功能则为开发者提供了定时任务调度的能力。本篇文章将详细介绍如何在IDEA中利用Spring Boot的Scheduled来实现任务调度...

    spring-boot 定时任务集群

    本篇文章将深入探讨如何在Spring Boot 2.1.6版本中配置和管理定时任务,并实现任务的集群部署以及任务的持久化存储到MySQL数据库。 **一、Spring Boot定时任务** 1. **@Scheduled注解**:Spring Boot提供了对定时...

    IntelliJ IDEA中创建Spring boot项目,定时任务测试

    4. **添加依赖**:在Dependencies(依赖)一栏,可以通过搜索框添加Spring Boot的定时任务支持,即`spring-boot-starter-quartz`或`spring-boot-starter-task`。后者是Spring Boot官方推荐的定时任务解决方案。 5. ...

    详解Spring Boot中使用@Scheduled创建定时任务

    Spring Boot 中使用 @Scheduled 创建定时任务 Spring Boot 框架为我们提供了多种方式来创建定时任务,其中一种方式是使用 @Scheduled 注解。@Scheduled 是 Spring Framework 中的一种注解,用于标记需要定时执行的...

    maven工程-基于springboot定时任务

    首先,我们需要了解Spring Boot中的定时任务是通过其内置的`@Scheduled`注解和`TaskScheduler`或`SchedulerTaskExecutor`实现的。`@Scheduled`注解允许我们在方法上声明一个定时任务,而`TaskScheduler`和`...

    Spring Boot实战派(源码)

    - 使用`@Scheduled`注解实现定时任务,或者集成Quartz或CronTrigger。 11. **消息传递** - Spring Boot支持集成RabbitMQ、Kafka等消息中间件,使用`@RabbitListener`或`@KafkaListener`处理消息。 12. **缓存** ...

    spring-context-support-4.2.2.RELEASE.jar 的jar包

    例如,你可以通过XML配置或者使用`@Scheduled`注解来定义周期性执行的任务,这对于实现后台的定时任务处理非常有用,如数据同步、报表生成等。 2. **邮件服务支持**: 该模块还提供了对JavaMailSender接口的实现,...

    springboot与scheduler结合的定时任务工具、实例项目

    在这个"springboot与scheduler结合的定时任务工具、实例项目"中,我们将深入探讨如何在Spring Boot应用中利用Spring Scheduler来执行计划任务。 首先,Spring Scheduler提供了一个方便的方式来安排和执行周期性任务...

    springboot动态配置定时任务(schedule)

    总结来说,Spring Boot通过`@Scheduled`注解提供了强大的定时任务功能,结合`@ConfigurationProperties`和`@RefreshScope`,我们可以轻松实现定时任务的动态配置,使得任务管理更加灵活。这不仅简化了开发流程,也...

Global site tag (gtag.js) - Google Analytics