分散式後臺作業排程器JobRunr介紹 - JAXenter

banq發表於2022-03-01

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`:

  1. org.jobrunr.background-job-server.enabled=true
  2. 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上找到。

相關文章