类似Quartz的分布式Java后台作业计划程序:JobRunr


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();
    }
}

点击标题