我正在为多租户Web应用程序开发一项新功能,该功能允许管理员通过单击管理面板中的按钮来开始可能非常长的运行过程(大约1-5分钟)。
但是至关重要的是,每个租户一次只能执行一次这样的任务。当然,我们可以在单击后禁用按钮,但是我们不能阻止管理员(或其他管理员)打开另一个浏览器选项卡并再次单击该按钮。
有没有现成的图书馆可以让我们:
我已经研究了石英和Spring TaskExecutor。但是,这两个似乎主要集中于在给定时间安排任务(例如cronjob)。我正在寻找的是一种可随时以编程方式运行和监视后台作业的解决方案。
答案 0 :(得分:0)
如果决定使用Quartz,则可以使用@ {DisallowConcurrentExecution批注简单地批注相关的作业实现类。
请注意,此批注在Quartz作业详细信息级别有效,而不在作业实施类级别有效。假设您有一个作业实现类com.foo.MyTenantTask,并使用@DisallowConcurrentExecution批注对该类进行了批注。然后,您注册2个使用此作业实现任务的作业-tenant_001_task和tenant_002_task。
如果您运行tenant_001_task和tenant_002_task,则它们可以同时运行,因为它们是不同的作业(作业详细信息)。但是,如果您尝试同时运行多个tenant_001_task实例,则Quartz将仅执行第一个实例,而其他实例将排队等待第一个实例完成执行。然后,Quartz将选择一个排队的tenant_001_task实例并执行它,依此类推,直到所有排队的tenant_001_task实例均已执行。
另一方面,Quartz不会阻止并发执行tenant_001_task和tenant_002_task实例,因为它们代表不同的作业(作业详细信息)。
Quartz提供了各种(本地,JMX,RMI)API,这些API使您能够获取当前正在执行的作业列表,所有已注册作业及其触发器等的列表。它无疑将使您能够实现所描述的调度逻辑。 / p>
如果您要构建用于管理和监视Quartz作业,触发器等的应用程序,建议您快速浏览一下我们名为QuartzDesk的产品。它是用于所有类型的基于Java Quartz的应用程序的管理和监视GUI。有一个public online demo,如果您想在本地进行实验,可以request a 30-day trial license key。如果需要以编程方式(可能是远程)与Quartz调度程序进行交互,则可以使用QuartzDesk提供的各种JAX-WS服务API。