什么是quartz?
Quartz是一個完全由 Java 編寫的開源任務調度框架。
我們經常會遇到一些問題:
想每個月27號,提醒信用卡還款;
想每隔1小時,提醒一下,累了,站起來活動一下;
想每個月定時發送郵件,等等。
總結起來就是,在一個有規律的時間點做某件事。
quartz可滿足復雜觸發條件下的定時任務調度,比如每月的周一和周五 10點 15分執行。
quartz集群可保證系統的高可用性,即使一個節點崩了,也能保證任務的執行。
集群環境下,一個任務某個時間點只會在一個節點上運行。
核心概念
Job 表示一個工作,要執行的具體內容JobDetail 表示任務的定義,Job 是任務的執行邏輯Trigger 代表一個調度參數的配置,什么時候去調Scheduler 代表一個調度容器,一個調度容器中可以注冊多個 JobDetail 和 Trigger。當 Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調度了。quartz集群應用
集群中的節點放在不同的服務器上,稱為水平集群。
節點放在同一臺機器上,稱為垂直集群,存在著單點故障問題。
Quartz可以借助關系數據庫和JDBC作業存儲支持集群。
數據庫腳本
鏈接:https://pan.baidu.com/s/1BpDTVRwtN6_VVJqTx9flNQ
提取碼:49ie
搭建spring boot環境
以定時發送郵件為例,每隔1分鐘發送一次,郵件發送功能忽略,不是本例重點。
開發工具:Intellij IDEA
添加maven 依賴
配置
server: port: ${PORT:8090}spring: application: name: learn-quartz datasource: druid: url: ${MYSQL_URL:jdbc:mysql://192.168.0.113:3306/quartz?characterEncoding=utf-8&useSSL=false} username: root password: 123456 driverClassName: com.mysql.cj.jdbc.Driver initialSize: 5 #初始建立連接數量 minIdle: 5 #最小連接數量 maxActive: 20 #最大連接數量 maxWait: 10000 #獲取連接最大等待時間,毫秒 testOnBorrow: true #申請連接時檢測連接是否有效 testOnReturn: false #歸還連接時檢測連接是否有效 timeBetweenEvictionRunsMillis: 60000 #配置間隔檢測連接是否有效的時間(單位是毫秒) minEvictableIdleTimeMillis: 300000 #連接在連接池的最小生存時間(毫秒) quartz: job-store-type: jdbc #數據庫方式 jdbc: initialize-schema: never #不初始化表結構 properties: org: quartz: scheduler: instanceId: AUTO #默認主機名和時間戳生成實例ID,可以是任何字符串,但對于所有調度程序來說,必須是唯一的 對應qrtz_scheduler_state INSTANCE_NAME字段 instanceName: clusteredScheduler #quartzScheduler jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX #持久化配置 driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #我們僅為數據庫制作了特定于數據庫的代理 useProperties: false #以指示JDBCJobStore將JobDataMaps中的所有值都作為字符串,因此可以作為名稱 - 值對存儲而不是在BLOB列中以其序列化形式存儲更多復雜的對象。從長遠來看,這是更安全的,因為您避免了將非String類序列化為BLOB的類版本問題。 tablePrefix: QRTZ_ #數據庫表前綴 misfireThreshold: 60000 #在被認為“失火”之前,調度程序將“容忍”一個Triggers將其下一個啟動時間通過的毫秒數。默認值(如果您在配置中未輸入此屬性)為60000(60秒)。 clusterCheckinInterval: 5000 #設置此實例“檢入”*與群集的其他實例的頻率(以毫秒為單位)。影響檢測失敗實例的速度。 isClustered: true #打開群集功能 threadPool: #連接池 class: org.quartz.simpl.SimpleThreadPool threadCount: 10 threadPriority: 5 threadsInheritContextClassLoaderOfInitializingThread: true
public class EmailJob extends QuartzJobBean { @Value("${server.port}") String port; @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { String time = DateUtil.now(); System.out.println(time + " send email,server port:" + port); }}
@Configurationpublic class QuartzConfig { @Bean public JobDetail jobSendEmailDetails() { return JobBuilder.newJob(EmailJob.class).withIdentity("emailJobId") .storeDurably().build(); } /** * 1分鐘1次,會平均分配到每個節點上 * @return */ @Bean public Trigger jobOrderCheckTrigger() { return TriggerBuilder.newTrigger().forJob(jobSendEmailDetails()) .withIdentity("sendEmailTriggerId") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) .build(); }}
創建2個應用
選擇Edit Configurations, 在spring boot目錄下創建quartz1和quartz2, VM options中分別輸入-DPORT=8090和-DPORT=8091, 啟動兩個實例,同一個任務會在兩個實例中輪流執行,效果圖:
quartz1
quartz2
總結
以上是生活随笔為你收集整理的mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。