分散式後臺作業排程器JobRunr介紹 - JAXenter
JobRunr 分析所有作業並將其序列化為 SQL 或 NoSQL 資料庫的可讀 JSON。如果建立了太多後臺作業,您可以通過啟動更多應用程式例項來水平擴充套件。由於作業以 JSON 格式儲存在中央資料庫中,因此工作負載可以分佈在多個 JVM 上。
JobRunr 是一個庫,您可以將其嵌入到現有應用程式中以啟用後臺作業的排程。作業可以是在後臺執行緒中執行的短期或長期程式。一個典型的用例是將長時間執行的程式從 Web 請求解除安裝到後臺執行緒,從而為終端使用者帶來更好的體驗。
JobRunr 分析所有作業並將其序列化為 SQL 或 NoSQL 資料庫的可讀 JSON。如果建立了太多後臺作業,您可以通過啟動更多應用程式例項來水平擴充套件。由於作業以 JSON 格式儲存在中央資料庫中,因此工作負載可以分佈在多個 JVM 上。一旦您的應用程式的新例項啟動,JobRunr 就會自動開始處理作業。為了確保同一個作業不會被多次處理,它使用了樂觀鎖定。沒有人喜歡清理,這就是 JobRunr 也是自我維護的原因 - 所有成功的作業將在可配置的時間後自動刪除。
有時您不想立即執行作業——您需要它在明天執行(例如,使用者註冊後的第二天),或者您可能想要執行重複性作業。所有這些都是開箱即用的。
生活並不總是完美無缺的——如果後臺作業失敗(例如,由於依賴的 API 關閉),它會通過智慧退避策略自動重試。
JobRunr 還帶有一個內建儀表板,可讓您監控所有作業。
您可以輕鬆建立後臺作業:
- 通過 Java 8 lambda,您可以重用任何現有服務
- 或通過 JobRequest 和 JobRequestHandler
在本文中,您將學習如何通過 Java 8 lambda 和 JobRequest 排程一個簡單的後臺作業。
Maven依賴:
<dependency> <groupId>org.jobrunr</groupId> <artifactId>jobrunr-spring-boot-starter</artifactId> <version>4.0.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.210</version> </dependency> |
在這裡,您要新增 3 個依賴項:
- 啟用 JobRunr 和 Spring Boot 之間的整合的`jobrunr-spring-boot-starter`。
- 此`spring-boot-starter-data-jpa`並不是真正必要的,但它會有所幫助,因為它會自動為您建立一個 DataSource。
- `h2`您將用於儲存所有作業狀態的資料庫
JobRunr 預設只啟用作業排程程式。由於後臺作業伺服器和儀表板僅可選擇加入,因此您需要向 Spring 新增一些屬性`application.properties`:
- org.jobrunr.background-job-server.enabled=true
- org.jobrunr.dashboard.enabled=true
第一個屬性告訴 JobRunr 啟用後臺作業伺服器,以便實際處理作業。第二個屬性啟用 JobRunr 儀表板。
作業儲存:
預設情況下,JobRunr 將嘗試使用您現有的`javax.sql.DataSource`或任何受支援的 NoSQL 客戶端來儲存所有與作業相關的資訊。當您將依賴項新增到 時`spring-boot-starter-data-jpa`,已自動建立了一個 DataSource,因此您已準備就緒。
用法
- 通過 Job Lambda
要將 JobRunr 與 Job Lambda 一起使用,您首先需要注入一些 Spring Bean:
@Inject private JobScheduler jobScheduler; @Inject private SampleJobService sampleJobService; |
`JobScheduler`是 JobRunr 提供的一個 bean,允許您將新作業排入佇列或排程。
`SampleJobService` 可以是您想要呼叫可能需要一些時間來處理的方法的任何 Spring bean。它也可以是您想要新增一些額外彈性的方法,因為 JobRunr 會在發生異常時自動重試該方法。
現在,您可以輕鬆建立作業:
jobScheduler.enqueue(() -> sampleJobService.executeSampleJob()); |
傳遞引數也是可以的:
jobScheduler.enqueue(() -> sampleJobService.executeSampleJob("Hello! I will be executed in a Background process, perhaps even a different JVM")); |
上述兩個呼叫將確保 JobRunr 分析給定的 lambda,它將儲存在資料庫中,並且下一個可用的專用工作者worker將處理它。
- 通過 JobRequest 和 JobRequestHandler
你也可以通過JobRequest來建立一個作業。這將涉及到建立一個 "JobRequest "和 "JobRequestHandler",並對實際工作進行排隊。
public class SampleJobRequest implements JobRequest { private final String input; // needed for deserialization by Jackson protected TestJobRequest() { this(null); } public TestJobRequest(String input) { this(input); } @Override public Class<SampleJobRequestHandler> getJobRequestHandler() { return SampleJobRequestHandler.class; } public String getInput() { return input; } } |
在這裡,你首先建立一個`SampleJobRequest`,它可以接受你在建立作業時可用的引數。這個`JobRequest'還需要實現一個叫做`getJobRequestHandler'的方法。這個方法必須返回包含實際業務邏輯/後臺工作的類。
接下來,你需要建立一個`SampleJobRequestHandler`,它將包含你的實際背景工作者worker和業務邏輯。要做到這一點,必須實現一個`run'方法。當背景工作執行時,它將被提供給你上面建立的輸入。
@Service public static class SampleJobRequestHandler implements JobRequestHandler<SampleJobRequest> { @Override public void run(SampleJobRequest jobRequest) { System.out.println("Running sample job request in background: " + jobRequest.getInput()); } } |
現在只剩下一件事了:排隊作業。你可以按以下方式進行:
@Inject private JobRequestScheduler jobRequestScheduler; ... jobRequestScheduler.enqueue(new SampleJobRequest("Hello")); |
結論
在完成這篇文章後,你已經使用Spring Boot和JobRunr建立了你的第一個後臺作業。 這裡的重要細節是,你可以用最少的程式碼建立一個後臺作業,甚至可以在與你安排它的地方不同的JVM中執行。在這裡,我們只是簡單地觸及了JobRunr的一個功能,然而,它提供了更多的功能,如預定作業、迴圈作業等等。
本文的完整原始碼可以在Github上找到。
相關文章
- 類似Quartz的分散式Java後臺作業計劃程式:JobRunrquartz分散式Java
- Elastic-job實戰(分散式作業排程框架)AST分散式框架
- 如何在Spring中使用JobRunr實現後臺作業? - BaeldungSpring
- k8s排程器介紹(排程框架版本)K8S框架
- 系統設計:如何設計一個分散式作業排程器 ?- Rakshesh分散式
- JAVA 分散式 - 分散式介紹Java分散式
- 分散式任務排程平臺XXL-JOB分散式
- 分散式任務排程分散式
- 分散式排程任務-ElasticJob分散式AST
- 鏈家分散式作業平臺分散式
- 排程器簡介,以及Linux的排程策略Linux
- 分散式事務介紹分散式
- LTS分散式任務排程部署分散式
- 磁軌排程演算法介紹演算法
- 分散式任務排程平臺XXL-JOB快速搭建教程分散式
- KAFKA介紹(分散式架構)Kafka分散式架構
- 分散式賬本基本介紹分散式
- 整合了這個分散式任務排程平臺,真的很爽~~分散式
- 從零開始入門 K8s | 排程器的排程流程和演算法介紹K8S演算法
- Aloha:一個分散式任務排程框架分散式框架
- 中介軟體---分散式任務排程---Celery分散式
- Java 分散式任務排程平臺:PowerJob 快速開始+配置詳解Java分散式
- Apache DolphinScheduler + OceanBase,搭建分散式大資料排程平臺的實踐Apache分散式大資料
- 帶有分散式鎖的Go計劃任務排程器- DEV分散式Godev
- 一個輕量級的分散式定時任務排程平臺-Cloudtask分散式Cloud
- micro-job分散式任務排程框架更新分散式框架
- 新一代分散式任務排程框架分散式框架
- Flink排程之排程器、排程策略、排程模式模式
- zipkin分散式鏈路追蹤介紹分散式
- seata分散式事務AT模式介紹(二)分散式模式
- oracle排程程式作業dbms_schedulerOracle
- oracle使用DBMS_SCHEDULER排程作業Oracle
- linux作業系統介紹Linux作業系統
- 基於任務排程的企業級分散式批處理方案分散式
- 開源公開課丨大資料排程系統 Taier 任務排程介紹大資料AI
- SpringBoot專案接入分散式任務排程平臺xxl-job(2.0.2)說明Spring Boot分散式
- 多機器人協作排程問題機器人
- 深入瞭解Python的Dask分散式排程程式 - selectfromPython分散式