類似Quartz的分散式Java後臺作業計劃程式:JobRunr

banq發表於2021-05-29

JobRunr 提供了一個統一的程式設計模型,以可靠的方式處理後臺任務,並在共享主機、專用主機或 JVM 例項內的雲(你好 Kubernetes)上執行。
您可以在 Web 應用程式中啟動小型和處理作業,也可以水平擴充套件並新增儘可能多的後臺作業伺服器,以處理高峰作業。JobRunr 將為您在所有伺服器上分配負載。JobRunr 也是容錯的 - 外部 Web 服務是否關閉?不用擔心,該作業會透過智慧退避策略自動重試 10 次。
與JobRunr類似有: Quartz 和Spring Task Scheduler,其他類似開源有 HangFireResqueSidekiqdelayed_jobCelery 。

特徵:
  • 簡單:只需使用 Java 8 lambda 來建立後臺作業。
  • 分散式和叢集友好:使用樂觀鎖定保證由單個排程程式例項執行。
  • 持久作業:使用 RDMBS(四個表和一個檢視)或 noSQL 資料儲存。
  • 可嵌入:內建於現有應用程式中。
  • 最小依賴:(ASM、 slf4j 以及jackson和 jackson-datatype-jsr310、gson或 JSON-B 相容庫)。

 
即發即忘的任務
即發即棄的作業只執行一次,並且幾乎在建立後立即執行。專用工作池執行緒會盡快執行排隊的後臺作業,從而縮短請求的處理時間。

BackgroundJob.enqueue(() -> System.out.println("Simple!"));

 
排程計劃和延遲任務
計劃呼叫和延遲的作業也只執行一次,但會在指定的時間執行。

BackgroundJob.schedule(Instant.now().plusHours(5), () -> System.out.println("Reliable!"));

 
重複執行任務
重複性工作從未如此簡單;只需呼叫以下方法即可使用CRON 表示式執行任何型別的重複任務。

BackgroundJob.scheduleRecurringly("my-recurring-job", Cron.daily(), () -> service.doWork());


 

在 Web 應用程式中處理後臺任務……
您可以在任何 Web 應用程式中處理後臺任務,我們對Spring提供全面支援- JobRunr 可以可靠地在 Web 應用程式中處理您的後臺作業。
……或其他任何地方
就像封裝在 docker 容器中的 Spring 控制檯應用程式一樣,它永遠執行並輪詢新的後臺作業。
 
安裝:

<dependency>
   <groupId>org.jobrunr</groupId>
   <artifactId>jobrunr</artifactId>
   <version>3.0.1</version>
</dependency>
對於Spring Boot,加入
jobrunr-spring-boot-starter 
只需設定您的application.properties:

# the job-scheduler is enabled by default
# the background-job-server and dashboard are disabled by default
org.jobrunr.job-scheduler.enabled=true
org.jobrunr.background-job-server.enabled=true
org.jobrunr.dashboard.enabled=true
或者程式碼:
@SpringBootApplication
public class JobRunrApplication {

    public static void main(String[] args) {
        SpringApplication.run(JobRunrApplication.class, args);
    }

    @Bean
    public JobScheduler initJobRunr(DataSource dataSource, JobActivator jobActivator) {
        return JobRunr.configure()
                .useJobActivator(jobActivator)
                .useStorageProvider(SqlStorageProviderFactory
                          .using(dataSource))
                .useBackgroundJobServer()
                .useDashboard()
                .initialize();
    }
}


點選標題

相關文章