有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于管理后台作业的java Spring兼容机制

我正在为多租户web应用程序开发一个新功能,它允许管理员通过单击管理面板中的按钮启动一个可能运行很长时间的流程(约1-5分钟)

但是,对于每个租户,这样的任务一次只能执行一次,这一点至关重要。当然,我们可以在单击后禁用按钮,但我们不能阻止管理员(或其他管理员)打开另一个浏览器选项卡并再次单击按钮

现有图书馆是否允许我们:

  • 唯一标识作业(例如,通过“租户\激活\任务”之类的id)
  • 在后台启动任务
  • 查询此类任务是否已在后台运行,如果已运行,则拒绝对该函数的任何进一步调用

我已经看过quartz和Spring任务执行器了。然而,这两种方法似乎主要关注于在给定时间安排任务(比如cronjob)。我要寻找的是一个解决方案,可以在任何时候以编程方式运行和监视后台作业


共 (1) 个答案

  1. # 1 楼答案

    如果您决定使用Quartz,您可以简单地用@DisallowConcurrentExecution注释相关的作业实现类

    请注意,此注释在Quartz作业详细信息级别有效,而不是在作业实现类级别有效。假设您有一个作业实现类com。福。MyTenantTask,您用@DisallowConcurrentExecution注释这个类。然后注册使用此作业实施任务的2个作业-租户\u 001\u任务和租户\u 002\u任务

    如果运行tenant_001_任务和tenant_002_任务,将允许它们同时运行,因为它们是不同的作业(作业详细信息)。但是,如果您尝试同时运行租户_001_任务的多个实例,Quartz将只执行第一个实例,其他实例将排队等待第一个实例完成执行。然后Quartz将选取租户_001_任务的一个排队实例并执行它,依此类推,直到租户_001_任务的所有排队实例都已执行

    另一方面,Quartz不会阻止租户_001_任务和租户_002_任务实例的并发执行,因为它们代表不同的作业(作业详细信息)

    Quartz提供了各种(本地、JMX、RMI)API,允许您获取当前正在执行的作业列表、所有已注册作业及其触发器的列表等。它当然允许您实现所描述的调度逻辑

    如果您正在构建一个应用程序来管理和监控您的石英作业、触发器等,我建议您快速浏览一下我们名为QuartzDesk的产品。它是一个管理和监视GUI,适用于所有类型的基于Java Quartz的应用程序。有一个public online demo,如果你想在本地进行实验,你可以request a 30-day trial license key。如果需要以编程方式(可能是远程方式)与Quartz调度器交互,可以使用QuartzDesk提供的各种JAX-WS服务API