gpt4 book ai didi

tomcat - Quartz Job Scheduler - Multi-Tenancy 设置

转载 作者:行者123 更新时间:2023-11-28 21:50:18 25 4
gpt4 key购买 nike

由于我还没有找到任何相关的东西来激发我的灵感,所以我想我会在这里想出这个。

我最近经常使用 Quartz Job Scheduler我已经在一个 RESTful Java Servlet 中实现了它,它应该提供一个基于 Sencha ExtJS 的 UI 来创建工作。我们将 Authenticator 类与 DatabaseManager 结合使用,后者负责对用户进行身份验证和所有其他特定于数据库的内容(使用 Hibernate)。

因为我们想在我们开发的 Java 企业应用程序中使用它,所以我们需要为每个客户运行这个东西。我们还需要在 MySQL 数据库上使用 JobStoreTX 来持久化数据(显然是为了集群),因此 volatile RAMJobStore 实现是一个禁忌。我知道官方文档并且 Quartz 本身似乎不支持 Multi-Tenancy 实现(参见 Quartz Clustering )。

我们的设置看起来有点像这样(简化):
- 1+ 生产 Tomcat(服务应用程序逻辑)
- 1+ production Apache(服务于 ExtJS 前端和静态内容)
- n 个数据库(每个客户一个)

要添加一些更棘手的东西:
我们有特定于客户的遗留模块(每个客户都有自己的应用程序托管),而更多最新模块则集中托管,并具有与客户相关的访问权限。

在我看来,在每个客户数据库上创建与 Quartz 相关的表是不够的,因为我们想坚持简单、直接的设置(这意味着例如每个客户的相同表前缀等)为了不使整个农场的 Quartz 部署复杂化。

我已经考虑过将它与 MariaDB MaxScale 结合起来,并使用 过滤器 基于 RegEx 或类似的东西将 Quartz 路由到每个客户数据库,而 Quartz 只与 MaxScale 对话代理,但这对于我试图实现的目标来说似乎有点太多开销,我什至不确定这是否有效。

有什么东西可以让我使用 Quartz 进行 Multi-Tenancy 吗?您能否建议一种方法使 Quartz 能够处理这个问题,因为我们需要为每个客户运行作业,但是在“一个”Tomcat(实际上是集群和负载平衡的)上?或者是否有其他产品/框架/库支持开箱即用的 Multi-Tenancy ?

非常感谢任何线索、想法或帮助!

最佳答案

你可以使用一个叫做 JobDataMap 的东西这只是 map ,您可以将其用作每项工作的数据容器。您需要做的是:

  • 创建新作业时,添加一些租户标识符
  • 创建 globalJobListener,您可以在其中将租户标识符从该映射注入(inject)到您的 tenantContext

这是我的代码:

// quartz configuration with custom job listener
@Configuration
public class MultiTenantQuartzAutoConfiguration {

@Bean
public SchedulerFactoryBean schedulerFactory() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory());
schedulerFactoryBean.setGlobalJobListeners(new MultiTenantQuartzJobListener());

return schedulerFactoryBean;
}

@Bean
public SpringBeanJobFactory jobFactory() {
return new SpringBeanJobFactory();
}
}

// custom job listener
public class MultiTenantQuartzJobListener implements JobListener {

private static final String NAME = "tenantContext";

@Override
public String getName() {
return NAME;
}

@Override
public void jobToBeExecuted(JobExecutionContext context) {
TenantContext.setTenantId(context.getJobDetail().getJobDataMap().getString(TenantContext.TENANT_HEADER));
}

@Override
public void jobExecutionVetoed(JobExecutionContext context) {
TenantContext.clear();
}

@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
TenantContext.clear();
}
}

// and here is how to create job with filled JobDataMap
Class c = Class.forName(jobInfo.getClassName());

JobDetail job = newJob(c)
.withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup())
.withDescription(jobInfo.getDesc())
.usingJobData(TenantContext.TENANT_HEADER, TenantContext.getTenantId())
.build();

CronTrigger trigger = newTrigger()
.withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup())
.withSchedule(cronSchedule(jobInfo.getCronExpression()))
.build();

var ft = scheduler.scheduleJob(job, trigger);

关于tomcat - Quartz Job Scheduler - Multi-Tenancy 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27847247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com