/*
* Copyright 1999-2015 dangdang.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.dangdang.ddframe.job.lite.config;
import com.dangdang.ddframe.job.config.JobRootConfiguration;
import com.dangdang.ddframe.job.config.JobTypeConfiguration;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* Lite作业配置.
*
* @author caohao
* @author zhangliang
*/
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public final class LiteJobConfiguration implements JobRootConfiguration {
private final JobTypeConfiguration typeConfig;
private final boolean monitorExecution;
private final int maxTimeDiffSeconds;
private final int monitorPort;
private final String jobShardingStrategyClass;
private final int reconcileIntervalMinutes;
private final boolean disabled;
private final boolean overwrite;
/**
* 获取作业名称.
*
* @return 作业名称
*/
public String getJobName() {
return typeConfig.getCoreConfig().getJobName();
}
/**
* 获取是否开启失效转移.
*
* @return 是否开启失效转移
*/
public boolean isFailover() {
return typeConfig.getCoreConfig().isFailover();
}
/**
* 创建Lite作业配置构建器.
*
* @param jobConfig 作业配置
* @return Lite作业配置构建器
*/
public static Builder newBuilder(final JobTypeConfiguration jobConfig) {
return new Builder(jobConfig);
}
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static class Builder {
private final JobTypeConfiguration jobConfig;
private boolean monitorExecution = true;
private int maxTimeDiffSeconds = -1;
private int monitorPort = -1;
private String jobShardingStrategyClass = "";
private boolean disabled;
private boolean overwrite;
private int reconcileIntervalMinutes = 10;
/**
* 设置监控作业执行时状态.
*
* <p>
* 每次作业执行时间和间隔时间均非常短的情况, 建议不监控作业运行时状态以提升效率, 因为是瞬时状态, 所以无必要监控. 请用户自行增加数据堆积监控. 并且不能保证数据重复选取, 应在作业中实现幂等性. 也无法实现作业失效转移.
* 每次作业执行时间和间隔时间均较长短的情况, 建议监控作业运行时状态, 可保证数据不会重复选取.
* </p>
*
* @param monitorExecution 监控作业执行时状态
*
* @return 作业配置构建器
*/
public Builder monitorExecution(final boolean monitorExecution) {
this.monitorExecution = monitorExecution;
return this;
}
/**
* 设置最大容忍的本机与注册中心的时间误差秒数.
*
* <p>
* 如果时间误差超过配置秒数则作业启动时将抛异常.
* 配置为-1表示不检查时间误差.
* </p>
*
* @param maxTimeDiffSeconds 最大容忍的本机与注册中心的时间误差秒数
*
* @return 作业配置构建器
*/
public Builder maxTimeDiffSeconds(final int maxTimeDiffSeconds) {
this.maxTimeDiffSeconds = maxTimeDiffSeconds;
return this;
}
/**
* 设置作业辅助监控端口.
*
* @param monitorPort 作业辅助监控端口
*
* @return 作业配置构建器
*/
public Builder monitorPort(final int monitorPort) {
this.monitorPort = monitorPort;
return this;
}
/**
* 设置作业分片策略实现类全路径.
*
* <p>
* 默认使用{@code com.dangdang.ddframe.job.plugin.sharding.strategy.AverageAllocationJobShardingStrategy}.
* </p>
*
* @param jobShardingStrategyClass 作业分片策略实现类全路径
*
* @return 作业配置构建器
*/
public Builder jobShardingStrategyClass(final String jobShardingStrategyClass) {
if (null != jobShardingStrategyClass) {
this.jobShardingStrategyClass = jobShardingStrategyClass;
}
return this;
}
/**
* 设置修复作业服务器不一致状态服务执行间隔分钟数.
*
* <p>
* 每隔一段时间监视作业服务器的状态,如果不正确则重新分片.
* </p>
*
* @param reconcileIntervalMinutes 修复作业服务器不一致状态服务执行间隔分钟数
*
* @return 作业配置构建器
*/
public Builder reconcileIntervalMinutes(final int reconcileIntervalMinutes) {
this.reconcileIntervalMinutes = reconcileIntervalMinutes;
return this;
}
/**
* 设置作业是否启动时禁止.
*
* <p>
* 可用于部署作业时, 先在启动时禁止, 部署结束后统一启动.
* </p>
*
* @param disabled 作业是否启动时禁止
*
* @return 作业配置构建器
*/
public Builder disabled(final boolean disabled) {
this.disabled = disabled;
return this;
}
/**
* 设置本地配置是否可覆盖注册中心配置.
*
* <p>
* 如果可覆盖, 每次启动作业都以本地配置为准.
* </p>
*
* @param overwrite 本地配置是否可覆盖注册中心配置
*
* @return 作业配置构建器
*/
public Builder overwrite(final boolean overwrite) {
this.overwrite = overwrite;
return this;
}
/**
* 构建作业配置对象.
*
* @return 作业配置对象
*/
public final LiteJobConfiguration build() {
return new LiteJobConfiguration(jobConfig, monitorExecution, maxTimeDiffSeconds, monitorPort, jobShardingStrategyClass, reconcileIntervalMinutes, disabled, overwrite);
}
}
}