/*
*
* Copyright 2016 Robert Winkler and Bohdan Storozhuk
*
* 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 io.github.resilience4j.ratelimiter.internal;
import static java.util.Objects.requireNonNull;
import io.github.resilience4j.ratelimiter.RateLimiter;
import io.github.resilience4j.ratelimiter.RateLimiterConfig;
import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
import io.vavr.collection.Array;
import io.vavr.collection.Seq;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
/**
* Backend RateLimiter manager.
* Constructs backend RateLimiters according to configuration values.
*/
public class InMemoryRateLimiterRegistry implements RateLimiterRegistry {
private static final String NAME_MUST_NOT_BE_NULL = "Name must not be null";
private static final String CONFIG_MUST_NOT_BE_NULL = "Config must not be null";
private static final String SUPPLIER_MUST_NOT_BE_NULL = "Supplier must not be null";
private final RateLimiterConfig defaultRateLimiterConfig;
/**
* The RateLimiters, indexed by name of the backend.
*/
private final Map<String, RateLimiter> rateLimiters;
public InMemoryRateLimiterRegistry(final RateLimiterConfig defaultRateLimiterConfig) {
this.defaultRateLimiterConfig = requireNonNull(defaultRateLimiterConfig, CONFIG_MUST_NOT_BE_NULL);
rateLimiters = new ConcurrentHashMap<>();
}
/**
* {@inheritDoc}
*/
@Override
public Seq<RateLimiter> getAllRateLimiters() {
return Array.ofAll(rateLimiters.values());
}
/**
* {@inheritDoc}
*/
@Override
public RateLimiter rateLimiter(final String name) {
return rateLimiter(name, defaultRateLimiterConfig);
}
/**
* {@inheritDoc}
*/
@Override
public RateLimiter rateLimiter(final String name, final RateLimiterConfig rateLimiterConfig) {
requireNonNull(name, NAME_MUST_NOT_BE_NULL);
requireNonNull(rateLimiterConfig, CONFIG_MUST_NOT_BE_NULL);
return rateLimiters.computeIfAbsent(
name,
limitName -> new AtomicRateLimiter(name, rateLimiterConfig)
);
}
/**
* {@inheritDoc}
*/
@Override
public RateLimiter rateLimiter(final String name, final Supplier<RateLimiterConfig> rateLimiterConfigSupplier) {
requireNonNull(name, NAME_MUST_NOT_BE_NULL);
requireNonNull(rateLimiterConfigSupplier, SUPPLIER_MUST_NOT_BE_NULL);
return rateLimiters.computeIfAbsent(
name,
limitName -> {
RateLimiterConfig rateLimiterConfig = rateLimiterConfigSupplier.get();
requireNonNull(rateLimiterConfig, CONFIG_MUST_NOT_BE_NULL);
return new AtomicRateLimiter(limitName, rateLimiterConfig);
}
);
}
}