精通Java后台任务开发,使用Spring简化异步任务处理

本文介绍如何使用JobRunr构建可扩展、分布式和弹性的后台作业,包括用例、替代方案和操作指南。

微信搜索关注《Java学研大本营》

1 介绍

在现代应用程序开发中,后台作业发挥着关键作用,让我们能够异步执行任务并将耗时操作从请求/响应周期中卸载。它们确保任务独立于用户交互执行,提高了整体用户体验和系统性能。如果我们加入分布式执行和扩展性这个维度,将成为一个具有挑战性的任务。

图片

在本文中,我们将探讨后台作业的用例、常见替代方案以及如何使用JobRunr构建可扩展、分布式和弹性的后台作业。

图片

2 后台作业的类型

以下是我们在应用程序中看到的一些常见模式,使用后台作业:

  • 长时间运行或需要大量资源的任务:后台作业非常适合处理需要大量处理时间或消耗许多系统资源的操作。通过异步执行这些任务,主要应用程序可以保持对用户请求的响应性,而不会被阻止。

  • 定时任务:后台作业通常用于执行定时或周期性任务。这包括像数据库清理、数据备份或生成常规报告之类的任务。通过在后台调度这些任务,应用程序可以确保它们在指定的间隔执行,而不会影响系统的响应性。

  • 重复任务:后台作业也可以在主应用程序范围之外运行重复任务。这包括定期监视外部系统并根据结果执行操作。通过在后台运行这些任务,应用程序可以确保它们在指定的间隔执行,而不会影响系统的响应性。

3 常见的替代方案

在深入了解JobRunr的细节之前,让我们先看一些实现后台作业并使其可扩展和分布式运行的常见替代方案:

  • 线程:实现后台作业最简单的方法是使用线程。这种方法易于实现,对于不需要太多处理时间或系统资源的简单任务效果很好。但是,随着任务数量的增加,管理和扩展可能会很困难。它也不提供任何内置的支持计划或重复任务。

  • Quartz:另一种选择是使用像Quartz这样的作业调度框架。这些框架提供内置的支持计划和重复任务,但Quartz适用于需要高级调度功能和强大功能集的情况。这也涉及到运行规模时的大量设置和配置。

  • 大数据:另一种选择是使用Hadoop或Spark等大数据解决方案。这些系统设计用于在多个节点上并行处理大量数据。它们提供内置的支持计划和重复任务,但需要大量的设置和配置。这些框架基于不同的编程模型,这意味着涉及大量的学习曲线。

4 JobRunr

JobRunr是一个轻量级的Java和Spring Framework后台作业构建库。它提供了一个简单的API来创建和执行后台作业。JobRunr还支持计划和重复任务以及在多个节点上的分布式执行。JobRunr依靠数据存储(内存、Redis、MongoDB、SQL)来存储作业及其元数据。使用JobRunr开发人员可以在最小的设置和配置下轻松地创建和管理后台作业,并且可以根据需要在多个节点上进行分布式执行。这些特性使得JobRunr成为一个非常有用的工具,可以帮助开发人员创建高性能和可扩展的后台作业系统。

这是JobRunr的高级架构:

图片

5 开始项目

在本节中,我们介绍在您的项目(Java和Spring Framework)中设置JobRunr的步骤,运行一个简单的后台作业,添加记录器并使用JobRunr仪表板监视作业。

图片

我们看下如何在普通Java和基于Spring Framework构建的应用程序中运行这些作业:

5.1 JobRunr设置

  • 您可以通过添加以下依赖项将JobRunr依赖项添加到pom.xml中。

图片

JobRunr需要一个数据存储来存储作业及其元数据,在本示例中,我们使用内存数据存储。

  • 将以下配置添加到application.properties文件中以启用JobRunr仪表板和作业服务器:

org.jobrunr.background-job-server.enabled=true
org.jobrunr.dashboard.enabled=true 
  • 通过添加以下代码来初始化您的应用程序,指定数据存储的详细信息:

图片

5.2 创建后台作业

JobRunr允许您创建三种类型的后台作业,分别是:

  • 即发即忘的作业:这种作业只执行一次,并且结果不会返回给调用者。这对于不需要任何反馈或作业响应的任务非常有用。您可以使用BackgroundJob.enqueue()方法创建即发即忘的作业,该方法接受一个lambda表达式作为参数。以下是Java和Spring Framework中的示例:

图片

  • 计划作业:这种作业在指定的时间或间隔执行。您可以使用BackgroundJob.schedule()方法创建计划作业,并且它接受一个lambda表达式或您可以注入一个类的实例。以下是Java和Spring Framework中的示例:

图片

这将在10分钟后执行lambda表达式。

  • 重复作业:这种作业定期执行。您可以使用BackgroundJob.scheduleRecurringly()方法创建重复作业,该方法接受cron表达式或Cron对象。以下是Java和Spring Framework中的示例:

图片

这将每隔五分钟执行lambda表达式。

5.3 监控作业

JobRunr提供了一个仪表板,允许您监视作业的状态,以下是它的外观:

仪表板访问链接:http://localhost:8000/dashboard

图片

5.4 添加记录器和进度条

  • 记录器:JobRunr支持记录,允许您从后台作业中记录消息。您可以使用JobContext.logger()方法添加记录器。您可以通过将其作为参数添加到lambda表达式中,将JobContext轻松注入到后台作业中。以下是一个示例:

BackgroundJob.enqueue(() -> myService.doWork(JobContext.Null))

// 实际实现
public class MyService {
    public void doWork(JobContext jobContext) {
        jobContext.logger().info("Hello from JobRunr!");
    }
}
  • 进度条:您可以使用JobContext.progress()方法报告后台作业的准确进度。进度条在JobRunr仪表板中是可见的,帮助用户了解作业的状态。进度条作为同一个JobContext对象的一部分,我们可以像使用记录器一样用它。以下是一个示例,显示如何增加进度条:

public class MyService {
    public void doWork(JobContext jobContext) {
        JobDashboardProgressBar progressBar = jobContext.progressBar(1000);
        for(int i = 0; i < 1000; i++) {
            progressBar.increaseByOne(); // 或者使用progressBar.setValue(i)直接设置值
        }
    }
}

5.5 删除作业

有时,您可能需要删除计划或重复作业。可以使用BackgroundJob.delete()方法执行此操作。以下是一个示例:

JobId jobId = BackgroundJob.<EmailSender>enqueue(x -> x.doWork());
BackgroundJob.delete(jobId);

6 总结

在本文中,我们探讨了后台作业的用例、常见替代方案以及如何使用JobRunr构建可扩展、分布式和弹性的后台作业。我们还了解了如何使用JobRunr框架调度、监视和删除作业。希望能对你有所帮助,我们明天见!

推荐书单

【秋日阅读企划】点击下方链接立享优惠,叠加五折使用

秋日阅读企划icon-default.png?t=N7T8https://pro.m.jd.com/mall/active/2Z3HoZGKy5i9aEpmoTUZnmcoAhHg/index.html

《Java语言程序设计(第3版)》

“十二五”普通高等教育本科国家级规划教材,畅销Java程序设计教材,已经被几百所高校选为教材。

本书第1版于2005年出版。第2版于2010年出版,是普通高等教育“十一五”国家级规划教材。第3版入选“十二五”高等教育本科国家级规划教材。 本书在介绍Java语言的同时,更注重Java语言的知识体系,系统性地分析了Java核心机制与基本原理。全书分为核心基础篇与应用技术篇。在核心基础篇中, 论述了面向对象程序设计的基本概念、Java语言基础(包括运算符与表达式、程序流控制、数组)、Java面向对象特性、异常处理方法、基于Swing的图形化用 户界面构造方法、输入/输出、Applet概念与应用。应用技术篇介绍了开发Java的高级应用技术,包括多线程、网络编程、JDBC数据库连接、J2EE技术、功能驱 动的Java程序开发方法以及Java编程规范。书中还提供了大量实例。 本书具有系统性、知识性、实用性等特点,可以作为大专院校教材,也可作为Java编程爱好者的参考书。
Java语言程序设计(第3版)icon-default.png?t=N7T8https://item.jd.com/11949337.html

图片

精彩回顾

使用Java读取、编写、确认Excel文档

一文搞懂Java正则表达式

一文搞懂Java中的lambda匿名函数

Java 21性能提升,会推出什么新特性?

超简单,实现Java线程池

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值