中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

小程序開發(fā)和網(wǎng)站開發(fā)的區(qū)別seo綜合查詢站長工具

小程序開發(fā)和網(wǎng)站開發(fā)的區(qū)別,seo綜合查詢站長工具,網(wǎng)站備案中的網(wǎng)站名稱,不同的網(wǎng)站有不同的風(fēng)格在spring框架中,對于簡單的定時任務(wù),可以使用 Scheduled 注解實(shí)現(xiàn),在實(shí)際項(xiàng)目中,經(jīng)常需要動態(tài)的控制定時任務(wù),比如通過接口增加、啟動、停止、刪除定時任務(wù),動態(tài)的改變定時任務(wù)的執(zhí)行時間等。 我們可以通過…

在spring框架中,對于簡單的定時任務(wù),可以使用 @Scheduled 注解實(shí)現(xiàn),在實(shí)際項(xiàng)目中,經(jīng)常需要動態(tài)的控制定時任務(wù),比如通過接口增加、啟動、停止、刪除定時任務(wù),動態(tài)的改變定時任務(wù)的執(zhí)行時間等。

我們可以通過編碼的方式動態(tài)控制定時任務(wù),具體的代碼參照 示例項(xiàng)目 https://github.com/qihaiyan/springcamp/tree/master/spring-dynamic-scheduler

一、概述

在spring框架可以通過 CronTask 和 TaskScheduler 動態(tài)控制定時任務(wù),實(shí)現(xiàn)定時任務(wù)的動態(tài)更新,比如修改定時任務(wù)的執(zhí)行時間,這個是 @Scheduled 無法實(shí)現(xiàn)的。采用編碼控制動態(tài)任務(wù)的方式,我們還可以把動態(tài)任務(wù)執(zhí)行信息保存到數(shù)據(jù)庫中,通過數(shù)據(jù)庫里的任務(wù)配置數(shù)據(jù)來動態(tài)控制定時任務(wù),也可以通過接口來動態(tài)控制定時任務(wù)。

二、配置定時任務(wù)

首先,同 @Scheduled 注解的方式一樣,動態(tài)控制定時任務(wù)也需要使用 @EnableScheduling 注解來開啟定時任務(wù)功能:

然后通過實(shí)現(xiàn) SchedulingConfigurer 接口來對動態(tài)任務(wù)進(jìn)行配置:

@Component
public class MyScheduler implements SchedulingConfigurer {private ScheduledTaskRegistrar taskRegistrar;private final ConcurrentHashMap<Long, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();@Overridepublic void configureTasks(@NonNull ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();threadPoolTaskScheduler.setPoolSize(10);// Set the pool of threadsthreadPoolTaskScheduler.setThreadNamePrefix("sys-scheduler");threadPoolTaskScheduler.initialize();this.taskRegistrar = taskRegistrar;this.taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);}@PreDestroypublic void destroy() {this.taskRegistrar.destroy();}
}

通過上面的代碼,我們就啟用了動態(tài)任務(wù)的基本能力,為動態(tài)任務(wù)指定了執(zhí)行線程池。

三、動態(tài)更新定時任務(wù)

更新定時任務(wù)通過 CronTask 和 TaskScheduler 來實(shí)現(xiàn),我們新增一個注冊定時任務(wù)的方法:

    public void registerTask(TaskData taskData) {//如果配置一致,則不需要重新創(chuàng)建定時任務(wù)if (scheduledFutures.containsKey(taskData.getId())&& cronTasks.get(taskData.getId()).getExpression().equals(taskData.getExpression())) {return;}//如果策略執(zhí)行時間發(fā)生了變化,則取消當(dāng)前策略的任務(wù)if (scheduledFutures.containsKey(taskData.getId())) {scheduledFutures.remove(taskData.getId()).cancel(false);cronTasks.remove(taskData.getId());}CronTask task = new CronTask(taskData, taskData.getExpression());TaskScheduler scheduler = taskRegistrar.getScheduler();if (scheduler != null) {ScheduledFuture<?> future = scheduler.schedule(task.getRunnable(), task.getTrigger());if (future != null) {scheduledFutures.put(taskData.getId(), future);}}}

我們新增了一個 registerTask 方法用于注冊定時任務(wù),入?yún)⒅?TaskData 是定時任務(wù)的配置數(shù)據(jù),為了簡單,我們把配置數(shù)據(jù)和執(zhí)行代碼放到了一起:

@Slf4j
@Data
@Entity
public class TaskData implements Runnable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String expression;@Transient@Overridepublic void run() {log.info("{} is running with expression {}", this.getName(), this.getExpression());}
}

核心代碼是創(chuàng)建一個 CronTask 對象,該對象包含兩個參數(shù):Runnable 方法和 cron 表達(dá)式。
CronTask 對象創(chuàng)建好后,通過 ScheduledTaskRegistrar 對定時任務(wù)進(jìn)行注冊,注冊完成后,定時任務(wù)就會在cron表達(dá)式指定的時間點(diǎn)開始執(zhí)行了。
執(zhí)行的代碼就是 Runnable 參數(shù)指定的方法。

四、動態(tài)停止定時任務(wù)

為了能夠動態(tài)停止定時任務(wù),我們在注冊定時任務(wù)時,把注冊結(jié)果放到了一個Map中:

private final ConcurrentHashMap<Long, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();ScheduledFuture<?> future = scheduler.schedule(task.getRunnable(), task.getTrigger());if (future != null) {scheduledFutures.put(taskData.getId(), future);}

新增停止定時任務(wù)的方法:

public void stop(Long id) {if (scheduledFutures.containsKey(id)) {scheduledFutures.remove(id).cancel(false);}}

該方法需要傳入定時任務(wù)的id,由于我們把定時任務(wù)信息保存到了 scheduledFutures 這個Map中,所以可以根據(jù)任務(wù)id參數(shù)查找到對應(yīng)的定時任務(wù)信息,然后調(diào)用對應(yīng)的 cancel方法來停止定時任務(wù)。

五、通過接口控制定時任務(wù)

通過上面的步驟我們已經(jīng)具備了動態(tài)控制定時任務(wù)的基本能力,下面增加接口來控制定時任務(wù):

@EnableScheduling
@SpringBootApplication
@RestController
public class DemoApplication {@Autowiredprivate MyScheduler myScheduler;@Autowiredprivate TaskDataRepository taskDataRepository;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@RequestMapping("/register")public TaskData register(String name,@RequestParam(name = "expression", required = false, defaultValue = "0/1 * * * * ?") String expression) {TaskData taskData = taskDataRepository.findOneByName(name).orElse(new TaskData());taskData.setName(name);taskData.setExpression(expression);taskData = taskDataRepository.save(taskData);myScheduler.registerTask(taskData);return taskData;}@RequestMapping("/stop")public void stop(Long id) {taskDataRepository.findById(id).ifPresent(taskData -> {myScheduler.stop(id);});}
}

我們提供了 register 和 stop 兩個接口,這兩個接口會在改變動態(tài)任務(wù)執(zhí)行數(shù)據(jù)時,先將數(shù)據(jù)保存到數(shù)據(jù)庫中,對定時任務(wù)進(jìn)行持久化,避免程序重啟后定時任務(wù)都丟失。

程序啟動后,我們首先調(diào)用 register 接口新增一個定時任務(wù):

http://localhost:8080/register?name=test

接口調(diào)用后,在日志中可以看到定時任務(wù)開始執(zhí)行了:

2024-01-07T18:02:09.003+08:00  INFO 23012 --- [ sys-scheduler5] c.s.springdynamicscheduler.TaskData      : test is running with expression 0/1 * * * * ?
2024-01-07T18:02:10.005+08:00  INFO 23012 --- [ sys-scheduler3] c.s.springdynamicscheduler.TaskData      : test is running with expression 0/1 * * * * ?
2024-01-07T18:02:11.012+08:00  INFO 23012 --- [ sys-scheduler3] c.s.springdynamicscheduler.TaskData      : test is running with expression 0/1 * * * * ?

再調(diào)用 stop 接口,通過日志可以發(fā)現(xiàn)定時任務(wù)停止了執(zhí)行:

http://localhost:8080/stop?id=1
http://www.risenshineclean.com/news/7586.html

相關(guān)文章:

  • 分享類網(wǎng)站怎么做百度關(guān)鍵詞seo優(yōu)化
  • 大數(shù)據(jù)營銷是做什么的網(wǎng)站是怎么優(yōu)化推廣的
  • 宣武做網(wǎng)站百度推廣怎么登錄
  • ui做的好的網(wǎng)站有哪些內(nèi)容百度一下馬上知道
  • 專業(yè)網(wǎng)站建設(shè)西安seo網(wǎng)站排名
  • 網(wǎng)頁版1688免費(fèi)網(wǎng)站做seo
  • 威海網(wǎng)頁設(shè)計制作公司自己怎么優(yōu)化網(wǎng)站
  • php做的網(wǎng)站畢設(shè)會問的問題100大看免費(fèi)行情的軟件
  • 漯河市住房建設(shè)局網(wǎng)站百度指數(shù)查詢手機(jī)版app
  • 長春做網(wǎng)站多少錢今日熱點(diǎn)新聞15條
  • 奢做品二手 哪個網(wǎng)站好獨(dú)立站建站平臺
  • 怎么通過淘寶優(yōu)惠券做網(wǎng)站賺錢網(wǎng)絡(luò)營銷的平臺有哪些
  • 惠陽做網(wǎng)站百度推廣助手手機(jī)版
  • 網(wǎng)站建設(shè)質(zhì)量保證域名ip地址在線查詢
  • 做網(wǎng)站的目標(biāo)是什么大型網(wǎng)站制作
  • 垣曲網(wǎng)站建設(shè)歐美網(wǎng)站建設(shè)
  • wordpress 電影moban百度搜索seo優(yōu)化技巧
  • 成都商城類網(wǎng)站設(shè)計淘寶店鋪怎么引流推廣
  • 做任務(wù)賺錢網(wǎng)站百度點(diǎn)擊軟件還有用嗎
  • 欽州浦北網(wǎng)站建設(shè)百度云群組
  • 學(xué)做網(wǎng)站在哪里營銷推廣軟文案例
  • 電子商務(wù)網(wǎng)站建設(shè)策劃書例子網(wǎng)絡(luò)廣告創(chuàng)意
  • 深圳官方網(wǎng)站制作站長工具怎么關(guān)掉
  • cms仿站十堰seo排名公司
  • aspcms網(wǎng)站使用教程愛站網(wǎng)ip反域名查詢
  • 虹口網(wǎng)站制作精準(zhǔn)客戶信息一條多少錢
  • 品牌網(wǎng)站建設(shè)的要點(diǎn)今日新聞?wù)?0條簡短
  • 網(wǎng)頁設(shè)計與網(wǎng)站建設(shè)第03章在線測試外鏈發(fā)布平臺有哪些
  • 青島學(xué)校論壇網(wǎng)站建設(shè)競價推廣的企業(yè)
  • 黃岡網(wǎng)站制作經(jīng)濟(jì)新聞最新消息財經(jīng)