【发布时间】:2015-01-08 18:39:09
【问题描述】:
由于我没有找到任何相关的东西来激发我的灵感,所以我想我会在这里想出这个。
我最近使用Quartz Job Scheduler 进行了很多工作,我已经在一个 RESTful Java Servlet 中实现了它,它应该提供一个基于 Sencha ExtJS 的 UI 来创建工作。我们将 Authenticator 类与 DatabaseManager 结合使用,后者负责对用户和所有其他特定于数据库的内容进行身份验证(使用 Hibernate)。
由于我们想在我们开发的 Java 企业应用程序中使用它,我们需要为每个客户运行这个东西。我们还要求将 JobStoreTX 用于 MySQL 数据库上的持久数据(显然用于集群),因此 volatile RAMJobStore 实现是一个禁忌。我知道官方文档,并且 Quartz 本身似乎不支持多租户实现(请参阅Quartz Clustering)。
我们的设置看起来有点像这样(简化):
- 1+ 生产 Tomcat(服务于应用程序逻辑)
- 1+ 生产 Apache(服务 ExtJS 前端和静态内容)
- n 个数据库(每个客户一个)
添加一些更棘手的东西:
我们有客户特定的遗留模块(每个客户都有自己的应用程序托管),而更多最新的模块则通过客户相关的访问集中托管。
在我看来,在每个客户数据库上创建与 Quartz 相关的表是不够的,因为我们希望坚持简单、直接的设置(这意味着例如每个客户的表前缀相同等)只是不会使整个场中的 Quartz 部署复杂化。
我已经考虑过将它与 MariaDB MaxScale 结合使用,并使用 filters 根据 RegEx 或类似的东西将 Quartz 路由到每个客户数据库,Quartz 只与 MaxScale 对话代理,但这对于我试图实现的目标来说似乎有点太多的开销,我什至不确定这是否会起作用。
有什么东西可以让我使用 Quartz 进行多租户?您能否建议一种使 Quartz 能够处理此问题的方法,因为我们需要为每个客户运行作业,但是在“一个”Tomcat(实际上是集群和负载平衡的)上运行?或者是否有其他开箱即用支持多租户的产品/框架/库?
非常感谢任何线索、想法或帮助!
【问题讨论】:
-
我们现在只处于开发阶段,但现在我们选择在每个客户数据库上创建与 Quartz 相关的表。如果需要,您可以通过石英属性文件更改石英表名称(因此它们将为每个客户等具有相同的表前缀)。
-
我想我找到了一个可以轻松应用于我们的软件架构的解决方案。由于每个客户都有自己的数据库,因此在整个应用程序逻辑中都有一个可用的系统参数,这对每个客户都是唯一的。此参数将在创建时自动附加到作业和组名称。这样,我们应该能够为所有客户在单个数据库上运行 Quartz。
-
目前工作顺利。只是一个问题:从我设计的界面(使用 Sencha ExtJS)创建工作,用户可以选择创建一次性工作或重复工作。当我创建一次性作业时,作业(和触发器)在执行后不会保留在数据库中。有没有办法保留已经解雇且不会在数据库中重复出现的工作?
-
我认为如果不再出现该作业,它将始终删除该作业。如果你想保存它以供用户重用,那么我们所做的就是将调度数据保存在一个单独的表中。如果你想记录,也许this 对你有用。
-
已修复。 Job 类有一个
@PersistJobDataAfterExecution注释。无论如何,谢谢。
标签: tomcat jakarta-ee quartz-scheduler mariadb multi-tenant