我正在为一个多租户web应用程序开发一个新功能,它允许管理员通过点击管理面板中的一个按钮,启动一个可能非常长的运行过程(约1-5分钟)。
但是,对于每个租户来说,这样的任务一次只能执行一次,这一点至关重要。当然,我们可以在单击后禁用该按钮,但我们不能阻止admin (或其他管理员)打开另一个浏览器选项卡,然后再次单击该按钮。
是否有任何现有的图书馆允许我们:
我已经看过石英和春季TaskExecutor了。然而,这两者似乎主要集中于在给定的时间安排任务(如cron作业)。我正在寻找的是一个解决方案,用于在任何时候以编程方式运行和监视后台作业。
发布于 2019-02-28 10:49:49
如果您决定使用Quartz,您可以简单地用@DisallowConcurrentExecution注释注释相关的作业实现类。
请注意,此注释在Quartz作业详细信息级别上有效,而在作业实现类级别上有效。假设您有一个作业实现类com.foo.MyTenantTask,并使用@DisallowConcurrentExecution注释对该类进行注释。然后注册两个使用此作业实现任务的作业- 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实例的并发执行,因为它们代表不同的作业(作业细节)。
石英提供了各种API(本地、JMX、RMI),这些API允许您获取当前正在执行的作业列表、所有已注册作业及其触发器的列表等。它肯定允许您实现所描述的调度逻辑。
如果您正在构建一个应用程序来管理和监视您的Quartz作业、触发器等,我建议您快速查看我们的产品QuartzDesk。它是用于所有类型的基于Java Quartz的应用程序的管理和监视GUI。有一个公众在线演示,如果您想在本地进行实验,可以使用申请30天试用许可证钥匙。如果您需要以编程方式(可能是远程)与Quartz调度程序交互,您可以使用QuartzDesk提供的各种JAX服务API。
https://stackoverflow.com/questions/54787171
复制相似问题