后端技术:Java定时任务的五种创建方式
Quartz表達式生成地址:http://cron.qqe2.com/
支持生成定時任務表達式和反解析,使用Quartz表達式的定時任務如下
xxl-job
springboot 的 @Scheduled
Quartz 框架
一、job 定時任務的五種創建方式
1、使用線程創建 job 定時任務
/***?TODO??使用線程創建?job?定時任務*?@author?王松*/ public?class?JobThread?{public?static?class?Demo01?{static?long?count?=?0;public?static?void?main(String[]?args)?{Runnable?runnable?=?new?Runnable()?{@Overridepublic?void?run()?{while?(true)?{try?{Thread.sleep(1000);count++;System.out.println(count);}?catch?(Exception?e)?{//?TODO:?handle?exception}}}};Thread?thread?=?new?Thread(runnable);thread.start();}} }2、使用 TimerTask 創建job定時任務
/***?TODO??使用?TimerTask?創建job定時任務*?@author?王松*/ public?class?JobTimerTask?{static?long?count?=?0;public?static?void?main(String[]?args)?{TimerTask?timerTask?=?new?TimerTask()?{@Overridepublic?void?run()?{count++;System.out.println(count);}};//創建timer對象設置間隔時間Timer?timer?=?new?Timer();//?間隔天數long?delay?=?0;//?間隔毫秒數long?period?=?1000;timer.scheduleAtFixedRate(timerTask,?delay,?period);} }3、使用線程池創建 job定時任務
?/***?TODO??使用線程池創建?job定時任務*?@author?王松*/ public?class?JobScheduledExecutorService?{public?static?void?main(String[]?args)?{Runnable?runnable?=?new?Runnable()?{@Overridepublic?void?run()?{//?task?to?run?goes?hereSystem.out.println("Hello?!!");}};ScheduledExecutorService?service?=?Executors.newSingleThreadScheduledExecutor();//?第二個參數為首次執行的延時時間,第三個參數為定時執行的間隔時間service.scheduleAtFixedRate(runnable,?1,?1,?TimeUnit.SECONDS);} }4.Quartz 框架
1.引入maven依賴
<dependencies><!--?quartz?--><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency> </dependencies>2.任務調度類
public?class?MyJob?implements?Job?{@Overridepublic?void?execute(JobExecutionContext?context)?throws?JobExecutionException?{System.out.println("quartz?MyJob?date:"?+?System.currentTimeMillis());} }3.啟動類
public?class?JobQuartz?{public?static?void?main(String[]?args)?throws?SchedulerException?{//1.創建Scheduler的工廠SchedulerFactory?sf?=?new?StdSchedulerFactory();//2.從工廠中獲取調度器實例Scheduler?scheduler?=?sf.getScheduler();//3.創建JobDetail,JobDetail?jb?=?JobBuilder.newJob(MyJob.class)//job的描述.withDescription("this?is?a?ram?job")//job?的name和group.withIdentity("ramJob",?"ramGroup").build();//任務運行的時間,SimpleSchedle類型觸發器有效,3秒后啟動任務long?time=??System.currentTimeMillis()?+?3*1000L;Date?statTime?=?new?Date(time);//4.創建Trigger//使用SimpleScheduleBuilder或者CronScheduleBuilderTrigger?t?=?TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger",?"ramTriggerGroup")//.withSchedule(SimpleScheduleBuilder.simpleSchedule())//默認當前時間啟動.startAt(statTime)//兩秒執行一次,Quartz表達式,支持各種牛逼表達式.withSchedule(CronScheduleBuilder.cronSchedule("0/2?*?*?*?*??")).build();//5.注冊任務和定時器scheduler.scheduleJob(jb,?t);//6.啟動?調度器scheduler.start();}5. springboot 的 @Scheduled 注解
@Component @Configuration??????//1.主要用于標記配置類,兼備Component的效果。 @EnableScheduling???//?2.開啟定時任務 public?class?SaticScheduleTask?{@Scheduled(cron?=?"0/5?*?*?*?*??")??//3.添加定時任務//@Scheduled(fixedRate=5000)????????//或直接指定時間間隔,例如:5秒private?void?configureTasks()?{System.err.println("執行靜態定時任務時間:?"?+?LocalDateTime.now());} }二、xxl-job 任務調度后臺 Admin
xxl-job 有什么用?
分布式集群的情況下,保證定時任務不被重復執行。
執行原理同Nginx 類型,所有定時任務通過任務調度平臺分發,也可配置負載均衡等等
首先讓我們能夠使用起來,搭建一個自己的任務
第一步: github下載源碼導入
下載地址:https://github.com/xuxueli/xxl-job/
當前版本目錄結構 2.1.1
第二步: 執行sql
文件地址:xxl-job/doc/db/tables_xxl_job.sql
當前2.1.1版本sql
第三步: 修改xxl-job-admin項目配置
配置文件:application.properties
修改數據庫連接
第四步: 啟動admin項目
springboot 方式啟動項目,
訪問 http://localhost:8080/xxl-job-admin/
賬號密碼:admin / 123456
任務調度中心就搭建好了
接下來需要創建一個服務器連接任務調度中心
三、自創建boot項目的任務xxl-job 示例demo
創建一個 boot 項目
我的目錄結構
pom.xml
web核心及 xxl-job-core
<!--?spring-boot-starter-web?(spring-webmvc?+?tomcat)?--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency><!--?xxl-job-core??版本號根據自己下載的版本修改?--> <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.1.1-SNAPSHOT</version> </dependency>logback.xml
日志配置直接拷貝
<?xml?version="1.0"?encoding="UTF-8"?> <configuration?debug="false"?scan="true"?scanPeriod="1?seconds"><contextName>logback</contextName><property?name="log.path"?value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/><appender?name="console"?class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS}?%contextName?[%thread]?%-5level?%logger{36}?-?%msg%n</pattern></encoder></appender><appender?name="file"?class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}</file><rollingPolicy?class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern></rollingPolicy><encoder><pattern>%date?%level?[%thread]?%logger{36}?[%file?:?%line]?%msg%n</pattern></encoder></appender><root?level="info"><appender-ref?ref="console"/><appender-ref?ref="file"/></root></configuration>application.properties 加入配置
需修改或自定義
xxl-job admin 地址
xxl.job.executor.appname 自定義名稱,后臺配置必須對應
xxl.job.executor.ip 當前電腦Ip,或部署項目的電腦Ip
xxl.job.executor.port 端口
添加boot配置類 XxlJobConfig
package?xxljob.config; import?com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import?org.slf4j.Logger; import?org.slf4j.LoggerFactory; import?org.springframework.beans.factory.annotation.Value; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.Configuration;/***?xxl-job?xxljob.config*/ @SuppressWarnings("ALL") @Configuration public?class?XxlJobConfig?{private?Logger?logger?=?LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private?String?adminAddresses;@Value("${xxl.job.executor.appname}")private?String?appName;@Value("${xxl.job.executor.ip}")private?String?ip;@Value("${xxl.job.executor.port}")private?int?port;@Value("${xxl.job.accessToken}")private?String?accessToken;@Value("${xxl.job.executor.logpath}")private?String?logPath;@Value("${xxl.job.executor.logretentiondays}")private?int?logRetentionDays;@Bean(initMethod?=?"start",?destroyMethod?=?"destroy")public?XxlJobSpringExecutor?xxlJobExecutor()?{logger.info(">>>>>>>>>>>?xxl-job?xxljob.config?init.");XxlJobSpringExecutor?xxlJobSpringExecutor?=?new?XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppName(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);System.err.println(ip+":"+port);return?xxlJobSpringExecutor;}/***?針對多網卡、容器內部署等情況,可借助?"spring-cloud-commons"?提供的?"InetUtils"?組件靈活定制注冊IP;**????? 1、引入依賴:*??????????<dependency>*?????????????<groupId>org.springframework.cloud</groupId>*?????????????<artifactId>spring-cloud-commons</artifactId>*?????????????<version>${version}</version>*?????????</dependency>**??????2、配置文件,或者容器啟動變量*??????????spring.cloud.inetutils.preferred-networks:?'xxx.xxx.xxx.'**??????3、獲取IP*??????????String?ip_?=?inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/ }任務job
@JobHandler(value="demoJobHandler") @Component public?class?DemoJobHandler?extends?IJobHandler?{static?int?count;@Overridepublic?ReturnT<String>?execute(String?param)?throws?Exception?{System.out.println("執行job任務"+count++);return?SUCCESS;} }admin 后臺配置
執行管理器下
任務管理下編輯任務
定時規則生成:http://cron.qqe2.com/
job任務名:@JobHandler注解值 >> 如:@JobHandler(value=“demoJobHandler”)
啟動
這樣就配置完成了
完成
應用項目:https://gitee.com/wslxm/spring-boot-plus2
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的后端技术:Java定时任务的五种创建方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fibonacci数列前20项_高考数学
- 下一篇: linux 文件名 序列号,在Linux