小程序怎么制作網(wǎng)站電商seo與sem是什么
Scheduled注解是Spring框架(包括Spring Boot)中用于實(shí)現(xiàn)定時(shí)任務(wù)的一種方式。以下是對(duì)Scheduled注解的詳細(xì)解析:
一、基本概念
Scheduled注解允許開發(fā)者在Spring容器中定義定時(shí)任務(wù)。通過簡(jiǎn)單地在一個(gè)方法上添加Scheduled注解,Spring容器就會(huì)自動(dòng)將這個(gè)方法配置為一個(gè)定時(shí)任務(wù)。這種方式不僅簡(jiǎn)化了定時(shí)任務(wù)的創(chuàng)建,還使得定時(shí)任務(wù)的管理變得更加靈活和可維護(hù)。
二、使用方式
Scheduled注解支持多種配置選項(xiàng),包括執(zhí)行計(jì)劃、固定延遲、固定速率等。以下是一些常見的使用方式:
- 固定速率執(zhí)行:使用
fixedRate
屬性指定任務(wù)執(zhí)行的固定速率(以毫秒為單位)。例如,@Scheduled(fixedRate=5000)
表示任務(wù)將每5秒執(zhí)行一次。 - 固定延遲執(zhí)行:使用
fixedDelay
屬性指定任務(wù)在上一次執(zhí)行完成后等待的固定延遲時(shí)間(以毫秒為單位)。例如,@Scheduled(fixedDelay=5000)
表示任務(wù)將在上一次執(zhí)行完成后5秒再次執(zhí)行。 - Cron表達(dá)式:使用
cron
屬性指定一個(gè)cron表達(dá)式來定義任務(wù)的執(zhí)行計(jì)劃。Cron表達(dá)式是一個(gè)字符串,由6或7個(gè)空格隔開的域組成,每個(gè)域代表一個(gè)時(shí)間單位(秒、分、時(shí)、日、月、周、年,其中年可選)。例如,@Scheduled(cron="0 0 12 * * ?")
表示任務(wù)將在每天的中午12點(diǎn)執(zhí)行。
三、注意事項(xiàng)
- @EnableScheduling注解:要使Scheduled注解生效,需要在配置類上添加
@EnableScheduling
注解。這個(gè)注解會(huì)開啟Spring的定時(shí)任務(wù)支持,并注冊(cè)一個(gè)ScheduledAnnotationBeanPostProcessor實(shí)例來解析和處理帶有Scheduled注解的方法。 - 線程池:在Spring Boot中,所有通過Scheduled注解定義的定時(shí)任務(wù)都會(huì)被放入一個(gè)公用的線程池中執(zhí)行。默認(rèn)情況下,該線程池的并發(fā)線程數(shù)為1,即所有的任務(wù)會(huì)使用同一個(gè)線程被依次執(zhí)行。如果需要并行執(zhí)行多個(gè)任務(wù),可以通過配置
spring.task.scheduling.pool.size
屬性來增加線程池的大小。 - 任務(wù)執(zhí)行時(shí)間:如果任務(wù)執(zhí)行時(shí)間超過間隔時(shí)間(對(duì)于fixedRate)或延遲時(shí)間(對(duì)于fixedDelay),Spring將盡可能地安排下一次執(zhí)行。但是,這可能會(huì)導(dǎo)致任務(wù)的實(shí)際執(zhí)行時(shí)間與預(yù)期有所偏差。因此,建議盡量保證任務(wù)能夠在較短的時(shí)間內(nèi)執(zhí)行完畢。
- 異常處理:在實(shí)際部署時(shí),需要考慮任務(wù)執(zhí)行時(shí)的異常處理和日志記錄。如果任務(wù)在執(zhí)行過程中拋出異常,可能會(huì)影響后續(xù)任務(wù)的執(zhí)行。因此,建議添加適當(dāng)?shù)漠惓L幚磉壿媮聿东@和處理可能出現(xiàn)的異常。
四、示例代碼
以下是一個(gè)使用Scheduled注解創(chuàng)建定時(shí)任務(wù)的示例代碼:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void reportCurrentTime() {System.out.println("The current time is: " + new java.util.Date());}
}// 配置類
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2 + 10); taskScheduler.initialize();taskRegistrar.setTaskScheduler(taskScheduler);}
}
在這個(gè)示例中,ScheduledTasks
類中的reportCurrentTime
方法被標(biāo)記為一個(gè)定時(shí)任務(wù),每5秒執(zhí)行一次并打印當(dāng)前時(shí)間。同時(shí),在配置類SchedulingConfig
上添加了@EnableScheduling
注解來開啟定時(shí)任務(wù)支持。
綜上所述,Scheduled注解是Spring框架中用于實(shí)現(xiàn)定時(shí)任務(wù)的一種方便且強(qiáng)大的方式。通過合理配置和使用Scheduled注解,可以輕松地創(chuàng)建和管理各種定時(shí)任務(wù)以滿足不同的業(yè)務(wù)需求。
五、開關(guān)控制定時(shí)任務(wù)
配置
jobs:corn:enable: truetestTask: "0 0/5 * * * ?"
定時(shí)任務(wù)
@ConditionalOnProperty(prefix = "jobs.corn", name = "enable", havingValue = "true")
@Component
@Slf4j
public class TestTask {@AutowiredTrainingJobService trainingJobService;@Scheduled(cron = "${jobs.corn.testTask:0/15 * * * * ?}")public void test() {log.info("TestTask test start");}}