/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* 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.
*/
package com.hazelcast.config;
import static com.hazelcast.util.Preconditions.checkNotNegative;
import static com.hazelcast.util.Preconditions.checkPositive;
/**
* Configuration options for the {@link com.hazelcast.scheduledexecutor.IScheduledExecutorService}
*/
public class ScheduledExecutorConfig {
/**
* The number of executor threads per Member for the Executor based on this configuration.
*/
private static final int DEFAULT_POOL_SIZE = 16;
/**
* The number of tasks that can co-exist per scheduler per partition
*/
private static final int DEFAULT_CAPACITY = 100;
/**
* The number of replicas per task scheduled in each ScheduledExecutor
*/
private static final int DEFAULT_DURABILITY = 1;
private String name = "default";
private int durability = DEFAULT_DURABILITY;
private int capacity = DEFAULT_CAPACITY;
private int poolSize = DEFAULT_POOL_SIZE;
private ScheduledExecutorConfig.ScheduledExecutorConfigReadOnly readOnly;
public ScheduledExecutorConfig() {
}
public ScheduledExecutorConfig(String name) {
this.name = name;
}
public ScheduledExecutorConfig(String name, int durability, int capacity, int poolSize) {
this.name = name;
this.durability = durability;
this.poolSize = poolSize;
this.capacity = capacity;
}
public ScheduledExecutorConfig(ScheduledExecutorConfig config) {
this(config.getName(), config.getDurability(), config.getCapacity(), config.getPoolSize());
}
/**
* Gets the name of the executor task.
*
* @return The name of the executor task.
*/
public String getName() {
return name;
}
/**
* Sets the name of the executor task.
*
* @param name The name of the executor task.
* @return This executor config instance.
*/
public ScheduledExecutorConfig setName(String name) {
this.name = name;
return this;
}
/**
* Gets the number of executor threads per member for the executor.
*
* @return The number of executor threads per member for the executor.
*/
public int getPoolSize() {
return poolSize;
}
/**
* Sets the number of executor threads per member for the executor.
*
* @param poolSize The number of executor threads per member for the executor.
* @return This executor config instance.
*/
public ScheduledExecutorConfig setPoolSize(int poolSize) {
checkPositive(poolSize, "Pool size should be greater than 0");
this.poolSize = poolSize;
return this;
}
/**
* Gets the durability of the executor
*
* @return the durability of the executor
*/
public int getDurability() {
return durability;
}
/**
* Sets the durability of the executor
* The durability represents the number of replicas that exist in a cluster for any given partition-owned task.
* If this is set to 0 then there is only 1 copy of the task in the cluster, meaning that if the partition owning it, goes
* down then the task is lost.
*
* @param durability the durability of the executor
* @return This executor config instance.
*/
public ScheduledExecutorConfig setDurability(int durability) {
checkNotNegative(durability, "durability can't be smaller than 0");
this.durability = durability;
return this;
}
/**
* Gets the capacity of the executor
*
* @return the capacity of the executor
*/
public int getCapacity() {
return capacity;
}
/**
* Sets the capacity of the executor
* The capacity represents the maximum number of tasks that a scheduler can have at any given point in time per partition.
* If this is set to 0 then there is no limit
*
* @param capacity the capacity of the executor
* @return This executor config instance.
*/
public ScheduledExecutorConfig setCapacity(int capacity) {
checkNotNegative(capacity, "capacity can't be smaller than 0");
this.capacity = capacity;
return this;
}
@Override
public String toString() {
return "ScheduledExecutorConfig{"
+ "name='" + name + '\''
+ ", durability=" + durability
+ ", poolSize-" + poolSize
+ ", capacity-" + capacity
+ '}';
}
ScheduledExecutorConfig getAsReadOnly() {
if (readOnly == null) {
readOnly = new ScheduledExecutorConfig.ScheduledExecutorConfigReadOnly(this);
}
return readOnly;
}
private static class ScheduledExecutorConfigReadOnly extends ScheduledExecutorConfig {
ScheduledExecutorConfigReadOnly(ScheduledExecutorConfig config) {
super(config);
}
@Override
public ScheduledExecutorConfig setName(String name) {
throw new UnsupportedOperationException("This config is read-only scheduled executor: " + getName());
}
@Override
public ScheduledExecutorConfig setDurability(int durability) {
throw new UnsupportedOperationException("This config is read-only scheduled executor: " + getName());
}
@Override
public ScheduledExecutorConfig setPoolSize(int poolSize) {
throw new UnsupportedOperationException("This config is read-only scheduled executor: " + getName());
}
@Override
public ScheduledExecutorConfig setCapacity(int capacity) {
throw new UnsupportedOperationException("This config is read-only scheduled executor: " + getName());
}
}
}