- 浏览: 3547889 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:38135
-
Cordova 3.x入门...
浏览量:607256
-
常用Java开源Libra...
浏览量:682254
-
搭建 CentOS 6 服...
浏览量:89314
-
Spring Boot 入...
浏览量:401781
-
基于Spring Secu...
浏览量:69685
-
MQTT入门
浏览量:91690
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
主要用于定时发送邮件、夜间自动维护等。
(1)开启定时任务功能
*** Spring4只允许定义一个TaskScheduler。
(2)定义定时任务
1)@Scheduled注解
2)实现SchedulingConfigurer
3)动态定义
TaskScheduler(ThreadPoolTaskScheduler)、Trigger(CronTrigger、PeriodicTrigger)。
(3)规则定义到配置文件
application.properties
(4)集群下的定时任务
1)通过AOP拦截限定定时任务的启动
多服务器的时候,不能所有服务器都同时执行定时任务,最简单的方法是只让特殊的服务才执行执行定时任务。
application.properties
2)集成Quartz Scheduler
Quartz的集群方案是基于数据库的,与Spring无缝对接。
a)导入jar
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
quartz properties
application.properties
c)定义Job
基于org.quartz.Job
基于org.springframework.scheduling.quartz.QuartzJobBean
(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
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
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 * * * ?
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 入门 - 进阶篇(8)- 应用监控(Actuator)
2017-03-16 14:57 17571作为Spring Boot的另外一大亮点,就是actuator ... -
Spring Boot 入门 - 进阶篇(7)- 自动配置(AutoConfigure)
2017-03-16 11:05 62258自动配置是Spring Boot的最大亮点,完美的展示了CoC ... -
Spring Boot 入门 - 进阶篇(6)- 启动加载(CommandLineRunner)
2017-03-15 15:04 15090启动成功后可以通过以下方法运行自己的初始代码: @PostCo ... -
Spring Boot 入门 - 进阶篇(5)- 数据缓存(@Cacheable)
2017-03-14 16:28 34667缓存可以缓解数据库访 ... -
Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)
2017-03-14 11:07 45281经常需要发送一个GET/POST请求到其他系统(REST AP ... -
Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)
2017-03-07 15:59 20085异步处理 Java的异步处理Thread/Runnable、 ... -
Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor
2017-03-07 10:39 10611用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都 ... -
Spring Boot 入门 - 基础篇(15)- 工程部署
2017-02-16 15:31 9052(1)开发阶段 一般开发过程: 1)-写代码 2)- [Ru ... -
Spring Boot 入门 - 基础篇(14)- 参数设置
2017-02-16 15:25 5732(1)读取优先顺序 a - 命令行参数 --key=val ... -
Spring Boot 入门 - 基础篇(13)- 异常处理
2017-02-16 10:23 8669先要了解Spring的异常处理:http://rensanni ... -
Spring Boot 入门 - 基础篇(12)- 数据校验
2017-02-16 09:53 19918除过在客户端做JavaScript数据校验外,服务器端做数据校 ... -
Spring Boot 入门 - 基础篇(11)- 数据源配置
2017-02-15 11:12 16398(1)单一数据源 默认Spring Boot会在classp ... -
Spring Boot 入门 - 基础篇(10)- 发送邮件
2017-02-14 10:04 2483(1)配置 pom.xml <dependency> ... -
Spring Boot 入门 - 基础篇(9)- 文件上传下载
2017-02-14 10:01 15888(1)单文件上传 Form方式 <form id=&qu ... -
Spring Boot 入门 - 基础篇(8)- 数据库操作
2017-02-10 16:17 8672(1)导入mybatis-spring-boot-starte ... -
Spring Boot 入门 - 基础篇(7)- 国际化
2017-02-10 13:58 13141Spring Boot默认支持国际化配置,只需要添加配置文件即 ... -
Spring Boot 入门 - 基础篇(6)- 页面模板
2017-02-09 15:00 6467Spring Boot支持很多模板引擎,但嵌入式容器JSP有限 ... -
Spring Boot 入门 - 基础篇(5)- 使用WebJars
2017-02-09 14:20 11746WebJars能使Maven的依赖管理支持OSS的JavaSc ... -
Spring Boot 入门 - 基础篇(4)- 静态资源
2017-02-09 13:10 10700静态资源包括:HTML、CSS、JS、图像、视频、PDF/Of ... -
Spring Boot 入门 - 基础篇(3)- 日志管理
2017-02-09 09:39 8481Spring Boot支持JUL,Log4J2和Logback ...
相关推荐
9. **定时任务**:"spring-boot-sample-task"演示了Spring Boot中如何配置和执行定时任务,包括使用@Scheduled注解。 通过这些示例,开发者可以了解Spring Boot在实际开发中的应用方式,从基础到高级,从简单到复杂...
`@Scheduled`注解是Spring提供的一个强大工具,用于声明式地配置定时任务,无需编写复杂的线程管理和调度逻辑。在这个例子中,我们将深入探讨`@Scheduled`的用法以及与之相关的`task:scheduler`和`task:executor`。 ...
这个名为"spring-boot-scheduled-task.zip"的压缩包很可能包含了一个完整的Spring Boot项目,用于演示或实践如何配置和使用Spring Boot的定时任务功能。在这个项目中,我们可以预期看到以下几个关键知识点: 1. **...
在Spring Boot框架中,`@Scheduled`注解是用于创建定时任务的重要工具,它使得开发者无需依赖外部的任务调度器如Quartz或CronJob,就能在应用内部轻松地实现周期性的任务执行。这个特性极大地简化了Java应用中的定时...
总之,"spring-boot-scheduled3.zip"这个案例通过Spring Boot和Quartz的集成,展示了如何在Java环境中创建和管理定时任务。这不仅有助于实现复杂的定时任务逻辑,还可以方便地扩展和调整任务执行策略,是企业级应用...
### Spring Boot中的@Scheduled注解:定时任务的原理与实现 #### 一、引言 在现代软件开发中,定时任务是一种非常常见的需求。无论是数据同步、定期清理缓存还是发送提醒邮件,都需要应用程序能够在特定的时间点...
`@Scheduled`注解是Spring Framework中用于创建定时任务的重要工具,它允许开发者在不重启应用的情况下,实现定时任务的动态配置,特别是修改cron表达式来调整执行周期。 在Spring中,定时任务主要通过`@Scheduled`...
"spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法" Spring Boot 中的定时任务是通过 @Scheduled 注解来实现的,该注解可以将方法标记为定时任务,Spring Boot 会自动发现并执行这些方法。@...
在Spring Boot应用中,我们可以利用其内置的Spring Scheduler框架来执行定时任务,无需引入像Quartz这样的第三方库。本案例将深入探讨如何使用Spring Boot的`@Scheduled`注解来创建和管理简单任务。 首先,我们需要...
首先,我们需要引入`spring-boot-starter-quartz`或者`spring-boot-starter-scheduled`依赖来启用Spring Boot的定时任务支持。Quartz是更强大的任务调度库,而`@Scheduled`注解则是Spring框架自带的简单定时任务解决...
本篇文章将深入探讨如何在Spring Boot中实现定时任务的动态开启和关闭。 首先,我们需要引入Spring Boot的`spring-boot-starter-quartz`或者`spring-boot-starter-task`依赖,这两个都是Spring框架提供的定时任务...
在Java开发领域,Spring Boot框架以其便捷的特性深受开发者喜爱,而Spring Boot集成的Scheduled功能则为开发者提供了定时任务调度的能力。本篇文章将详细介绍如何在IDEA中利用Spring Boot的Scheduled来实现任务调度...
本篇文章将深入探讨如何在Spring Boot 2.1.6版本中配置和管理定时任务,并实现任务的集群部署以及任务的持久化存储到MySQL数据库。 **一、Spring Boot定时任务** 1. **@Scheduled注解**:Spring Boot提供了对定时...
4. **添加依赖**:在Dependencies(依赖)一栏,可以通过搜索框添加Spring Boot的定时任务支持,即`spring-boot-starter-quartz`或`spring-boot-starter-task`。后者是Spring Boot官方推荐的定时任务解决方案。 5. ...
Spring Boot 中使用 @Scheduled 创建定时任务 Spring Boot 框架为我们提供了多种方式来创建定时任务,其中一种方式是使用 @Scheduled 注解。@Scheduled 是 Spring Framework 中的一种注解,用于标记需要定时执行的...
首先,我们需要了解Spring Boot中的定时任务是通过其内置的`@Scheduled`注解和`TaskScheduler`或`SchedulerTaskExecutor`实现的。`@Scheduled`注解允许我们在方法上声明一个定时任务,而`TaskScheduler`和`...
- 使用`@Scheduled`注解实现定时任务,或者集成Quartz或CronTrigger。 11. **消息传递** - Spring Boot支持集成RabbitMQ、Kafka等消息中间件,使用`@RabbitListener`或`@KafkaListener`处理消息。 12. **缓存** ...
例如,你可以通过XML配置或者使用`@Scheduled`注解来定义周期性执行的任务,这对于实现后台的定时任务处理非常有用,如数据同步、报表生成等。 2. **邮件服务支持**: 该模块还提供了对JavaMailSender接口的实现,...
在这个"springboot与scheduler结合的定时任务工具、实例项目"中,我们将深入探讨如何在Spring Boot应用中利用Spring Scheduler来执行计划任务。 首先,Spring Scheduler提供了一个方便的方式来安排和执行周期性任务...
总结来说,Spring Boot通过`@Scheduled`注解提供了强大的定时任务功能,结合`@ConfigurationProperties`和`@RefreshScope`,我们可以轻松实现定时任务的动态配置,使得任务管理更加灵活。这不仅简化了开发流程,也...