Quartz 작업 스케줄러 - 멀티 테넌트 설정
아직 영감을 줄 만한 걸 찾지 못했기 때문에 이 자리에서 생각을 해보려고 합니다.
저는 최근 Sencha ExtJS 기반의 UI를 제공하는 RESTful Java Servlet에 이미 구현되어 석영 Job Scheduler와 많은 작업을 했습니다.Authenticator 클래스를 Database Manager와 조합하여 사용합니다.이 클래스는 사용자 인증 및 기타 데이터베이스 고유의 모든 작업을 처리합니다(Hibernate 사용).
개발 중인 Java 엔터프라이즈 애플리케이션 내에서 사용하고 싶기 때문에 모든 고객에 대해 이 기능을 실행해야 합니다.또한 MySQL 데이터베이스의 영구 데이터(분명히 클러스터링용)에 JobStoreTX를 사용해야 하므로 휘발성 RAMJobStore 구현은 금기 사항입니다.공식 문서를 알고 있으며, Quartz 자체는 멀티 테넌트 구현을 지원하지 않는 것으로 보입니다(Quartz 클러스터링 참조).
설정은 다음과 같습니다(간단).
- 1+ 운영용 Tomcat (어플리케이션 로직 지원)
- 1+ 프로덕션 Apache (ExtJ 프론트 엔드 및 정적 콘텐츠 제공)
- n개의 데이터베이스(고객마다 1개씩)
더 까다로운 것을 추가하려면:
고객 고유의 레거시 모듈(각 고객이 독자적인 애플리케이션 호스팅을 제공)이 있는 반면, 보다 많은 최신 모듈은 고객 관련 액세스를 통해 중앙 집중식으로 호스팅됩니다.
팜 전체에 Quartz를 도입하는 작업이 복잡해지지 않도록 하기 위해 모든 고객 데이터베이스에 Quartz 관련 테이블을 작성하는 것만으로는 충분하지 않다고 생각합니다.이것은, 팜 전체에 Quartz를 도입하는 것을 복잡하게 하지 않기 위해서만, 간단하고 간단한 셋업(예를 들면, 각 고객의 테이블 프리픽스 등)을 계속하고 싶기 때문입니다.
이미 MariaDB MaxScale과 결합하여 필터를 사용하여 ReGEx 또는 유사한 기능을 기반으로 각 고객 데이터베이스에 Quartz를 라우팅하는 방안을 검토했습니다. Quartz는 MaxScale 프록시에게만 이야기하지만, 이 방법이 실행하려고 하는 것에 대해 오버헤드가 너무 오버헤드가 큰 것 같습니다.
쿼츠와의 멀티 테넌시(Multi-tenancy)를 얻을 수 있는 것이 있습니까?각 고객에 대해 작업을 실행해야 하는데, 실제로는 클러스터화되어 로드밸런싱된 "1개의" Tomcat에서 Quartz가 이 문제를 해결할 수 있도록 하는 방법을 제안해 주시겠습니까?또는 개봉 즉시 멀티 테넌시(Multi-tenancy)를 지원하는 다른 제품/프레임워크/라이브러리가 있습니까?
어떤 단서, 아이디어, 도움도 매우 감사합니다!
JobDataMap이라고 불리는 것을 사용할 수 있습니다.이것은 각 작업의 데이터 컨테이너로 사용할 수 있는 맵입니다.필요한 것은 다음과 같습니다.
- 새 작업을 생성할 때 일부 테넌트 ID 추가
globalJobListener
에서 테넌트 할 수 .
코드는 다음과 같습니다.
// 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);
마침내 여러 데이터베이스에 쓸 수 있게 되었습니다.
각 고객 파라미터에 따라 Quartz 속성 파일을 즉시 생성하여 프로그램 로직에서 새로 생성된 파일을 읽게 했습니다.마지막으로 각 고객은 자체 데이터베이스에 저장된 자체 Quartz 작업을 가집니다.
언급URL : https://stackoverflow.com/questions/27847247/quartz-job-scheduler-multi-tenant-setup
'source' 카테고리의 다른 글
Python에는 3진수 조건 연산자가 있나요? (0) | 2023.02.01 |
---|---|
명령줄에서 MySQL에 연결 (0) | 2023.02.01 |
CPU는 이 TensorFlow 바이너리를 사용하기 위해 컴파일되지 않은 명령을 지원합니다.AVX AVX2 (0) | 2023.01.22 |
Conda 환경 삭제 (0) | 2023.01.22 |
"NULL 포인터의 참조 해제"는 정확히 무엇을 의미합니까? (0) | 2023.01.22 |