/**
* Copyright 2016 vip.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
package com.vip.saturn.job.internal.config;
import com.google.common.base.Strings;
import com.vip.saturn.job.basic.AbstractElasticJob;
import com.vip.saturn.job.basic.JobTypeManager;
import com.vip.saturn.job.basic.SaturnConstant;
import com.vip.saturn.job.internal.storage.JobNodePath;
import com.vip.saturn.job.reg.base.CoordinatorRegistryCenter;
/**
* 作业配置信息.
*
*/
public class JobConfiguration {
private Class<? extends AbstractElasticJob> saturnJobClass;
//Test Use Only!
public JobConfiguration(String jobName, Class<? extends AbstractElasticJob> jobClass, int shardingTotalCount, String cron) {
this.jobName = jobName;
this.saturnJobClass = jobClass;
this.shardingTotalCount = shardingTotalCount;
this.cron = cron;
}
public JobConfiguration(CoordinatorRegistryCenter regCenter, String jobName) {
this.jobName = jobName;
this.regCenter = regCenter;
reloadConfig();//NOSONAR
}
public JobConfiguration(String jobName) {
this.jobName = jobName;
}
public Class<? extends AbstractElasticJob> getSaturnJobClass(){
//测试时可以直接设置实现类
if(saturnJobClass != null){
return saturnJobClass;
}
return JobTypeManager.getInstance().getHandler(getJobType());
}
/**
* 如果regCenter!=null, 取值从zk取
*/
private CoordinatorRegistryCenter regCenter = null;
/**
* 作业名称.
*/
private final String jobName;
private String jobClass="";
/**
* 作业分片总数.
*/
private int shardingTotalCount;
/**
* 时区
*/
private String timeZone;
/**
* 作业启动时间的cron表达式.
*/
private String cron;
/**
* 作业暂停时间段,日期段。
*/
private String pausePeriodDate = "";
/**
* 作业暂停时间段,小时分钟段。
*/
private String pausePeriodTime = "";
/**
* 分片序列号和个性化参数对照表.
*
* <p>
* 分片序列号和参数用等号分隔, 多个键值对用逗号分隔. 类似map.
* 分片序列号从0开始, 不可大于或等于作业分片总数.
* 如:
* 0=a,1=b,2=c
* </p>
*/
private String shardingItemParameters = "";
/**
* 作业自定义参数.
*
* <p>
* 可以配置多个相同的作业, 但是用不同的参数作为不同的调度实例.
* </p>
*/
private String jobParameter = "";
/**
* 统计作业处理数据数量的间隔时间.
*
* <p>
* 单位: 秒.
* 只对处理数据流类型作业起作用.
* </p>
*/
private int processCountIntervalSeconds = 300;
/**
* 是否开启失效转移.
*/
private boolean failover = true;
/**
* 作业是否启用
*/
private boolean enabled = false;
/**
* 作业描述信息.
*/
private String description = "";
/**
* 本地配置是否可覆盖注册中心配置.
* 如果可覆盖, 每次启动作业都以本地配置为准.
*/
private boolean overwrite;
/**
* Job超时时间
*/
private int timeoutSeconds;
/**
* 默认不开启,只显示异常情况下的日志;异常情况的日志无论开闭都会显示;日志保存在zk,只保存最新100行;
*/
private boolean showNormalLog = false;
/**
* 作业类型, 动态判断(非配置)
*/
private String jobType;
/**
* 作业接收的queue名字
*/
private String queueName = "";
/**
* 执行作业发送的channel名字
*/
private String channelName ="";
/**
* 每个分片的权重
*/
private Integer loadLevel = 1;
/**
* 每个作业的预分配列表
*/
private String preferList = "";
/**
* 是否上报执行信息(上报状态信息如completed,running,timeout)
*/
private Boolean enabledReport = null;
/**
* 是否启用本地模式
*/
private boolean localMode = false;
/**
* 是否启用串行消费(给消息作业使用,默认是并行的,并行的fetchSize默认为64)
*/
private boolean useSerial = false;
/**
* 是否使用非preferList
*/
private boolean useDispreferList = true;
public void reloadConfig(){
if (regCenter == null) {
return;
}
String valStr = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.TIMEOUTSECONDS));
if (!Strings.isNullOrEmpty(valStr)) {
timeoutSeconds = Integer.parseInt(valStr);
}
jobClass = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.JOB_CLASS));
if(jobClass != null){
jobClass = jobClass.trim();
}
jobType = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.JOB_TYPE));
valStr = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.SHARDING_TOTAL_COUNT));
if (!Strings.isNullOrEmpty(valStr)) {
shardingTotalCount = Integer.parseInt(valStr);
}
timeZone = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.TIMEZONE));
if (Strings.isNullOrEmpty(timeZone)) {
timeZone = SaturnConstant.TIME_ZONE_ID_DEFAULT;
}
cron = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.CRON));
pausePeriodDate = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.PAUSE_PERIOD_DATE));
pausePeriodTime = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.PAUSE_PERIOD_TIME));
shardingItemParameters = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.SHARDING_ITEM_PARAMETERS));
jobParameter = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.JOB_PARAMETER));
valStr = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.PROCESS_COUNT_INTERVAL_SECONDS));
if (!Strings.isNullOrEmpty(valStr)) {
processCountIntervalSeconds = Integer.parseInt(valStr);
}
failover = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.FAILOVER)));
enabled = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.ENABLED)));
description = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.DESCRIPTION));
showNormalLog = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.SHOW_NORMAL_LOG)));
queueName = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.QUEUE_NAME));
channelName = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.CHANNEL_NAME));
valStr = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.LOAD_LEVEL));
if (!Strings.isNullOrEmpty(valStr)) {
loadLevel = Integer.parseInt(valStr);
}
preferList = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.PREFER_LIST));
String enabledReportStr = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.ENABLED_REPORT));
if(!Strings.isNullOrEmpty(enabledReportStr)){
enabledReport = Boolean.valueOf(enabledReportStr);
}
localMode = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.LOCAL_MODE)));
useSerial = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.USE_SERIAL)));
useDispreferList = Boolean.valueOf(regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.USE_DISPREFER_LIST)));
}
public boolean isDeleting(){
return regCenter.isExisted(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.TO_DELETE));
}
public String getCronFromZk(){
cron = regCenter.getDirectly(JobNodePath.getNodeFullPath(jobName, ConfigurationNode.CRON));
return cron;
}
public CoordinatorRegistryCenter getRegCenter() {
return regCenter;
}
public String getJobName() {
return jobName;
}
public String getJobClass() {
return jobClass;
}
public int getShardingTotalCount() {
return shardingTotalCount;
}
public String getTimeZone() {
return timeZone;
}
public String getCron() {
return cron;
}
public String getPausePeriodDate() {
return pausePeriodDate;
}
public String getPausePeriodTime() {
return pausePeriodTime;
}
public String getShardingItemParameters() {
return shardingItemParameters;
}
public String getJobParameter() {
return jobParameter;
}
public int getProcessCountIntervalSeconds() {
return processCountIntervalSeconds;
}
public boolean isFailover() {
return failover;
}
public boolean isEnabled() {
return enabled;
}
public String getDescription() {
return description;
}
public boolean isOverwrite() {
return overwrite;
}
public int getTimeoutSeconds() {
return timeoutSeconds;
}
public boolean isShowNormalLog() {
return showNormalLog;
}
public String getJobType() {
return jobType;
}
public String getQueueName() {
return queueName;
}
public String getChannelName() {
return channelName;
}
public Integer getLoadLevel() {
return loadLevel;
}
public String getPreferList() {
return preferList;
}
public boolean isLocalMode() {
return localMode;
}
public boolean isUseSerial() {
return useSerial;
}
public boolean isUseDispreferList() {
return useDispreferList;
}
public void setSaturnJobClass(Class<? extends AbstractElasticJob> saturnJobClass) {
this.saturnJobClass = saturnJobClass;
}
public void setRegCenter(CoordinatorRegistryCenter regCenter) {
this.regCenter = regCenter;
}
public void setJobClass(String jobClass) {
this.jobClass = jobClass;
}
public void setShardingTotalCount(int shardingTotalCount) {
this.shardingTotalCount = shardingTotalCount;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public void setCron(String cron) {
this.cron = cron;
}
public void setPausePeriodDate(String pausePeriodDate) {
this.pausePeriodDate = pausePeriodDate;
}
public void setPausePeriodTime(String pausePeriodTime) {
this.pausePeriodTime = pausePeriodTime;
}
public void setShardingItemParameters(String shardingItemParameters) {
this.shardingItemParameters = shardingItemParameters;
}
public void setJobParameter(String jobParameter) {
this.jobParameter = jobParameter;
}
public void setProcessCountIntervalSeconds(int processCountIntervalSeconds) {
this.processCountIntervalSeconds = processCountIntervalSeconds;
}
public void setFailover(boolean failover) {
this.failover = failover;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public void setDescription(String description) {
this.description = description;
}
public void setOverwrite(boolean overwrite) {
this.overwrite = overwrite;
}
public void setTimeoutSeconds(int timeoutSeconds) {
this.timeoutSeconds = timeoutSeconds;
}
public void setShowNormalLog(boolean showNormalLog) {
this.showNormalLog = showNormalLog;
}
public void setJobType(String jobType) {
this.jobType = jobType;
}
public void setQueueName(String queueName) {
this.queueName = queueName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
public void setLoadLevel(Integer loadLevel) {
this.loadLevel = loadLevel;
}
public void setPreferList(String preferList) {
this.preferList = preferList;
}
public void setLocalMode(boolean localMode) {
this.localMode = localMode;
}
public void setUseSerial(boolean useSerial) {
this.useSerial = useSerial;
}
public void setUseDispreferList(boolean useDispreferList) {
this.useDispreferList = useDispreferList;
}
public Boolean isEnabledReport() {
return enabledReport;
}
public void setEnabledReport(Boolean enabledReport) {
this.enabledReport = enabledReport;
}
}