mirror of https://github.com/longtai-cn/hippo4j
parent
05557ddbf9
commit
1e1f821e46
@ -0,0 +1,48 @@
|
||||
package io.dynamic.threadpool.starter.spi;
|
||||
|
||||
import io.dynamic.threadpool.starter.spi.exception.ServiceLoaderInstantiationException;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Dynamic ThreadPool Service Loader.
|
||||
*
|
||||
* @author chen.ma
|
||||
* @date 2021/7/10 23:45
|
||||
*/
|
||||
public class DynamicTpServiceLoader {
|
||||
|
||||
private static final Map<Class<?>, Collection<Object>> SERVICES = new ConcurrentHashMap();
|
||||
|
||||
public static void register(final Class<?> serviceInterface) {
|
||||
if (!SERVICES.containsKey(serviceInterface)) {
|
||||
SERVICES.put(serviceInterface, load(serviceInterface));
|
||||
}
|
||||
}
|
||||
|
||||
private static <T> Collection<Object> load(final Class<T> serviceInterface) {
|
||||
Collection<Object> result = new LinkedList<>();
|
||||
for (T each : ServiceLoader.load(serviceInterface)) {
|
||||
result.add(each);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static <T> Collection<T> getSingletonServiceInstances(final Class<T> service) {
|
||||
return (Collection<T>) SERVICES.getOrDefault(service, Collections.emptyList());
|
||||
}
|
||||
|
||||
public static <T> Collection<T> newServiceInstances(final Class<T> service) {
|
||||
return SERVICES.containsKey(service) ? SERVICES.get(service).stream().map(each -> (T) newServiceInstance(each.getClass())).collect(Collectors.toList()) : Collections.emptyList();
|
||||
}
|
||||
|
||||
private static Object newServiceInstance(final Class<?> clazz) {
|
||||
try {
|
||||
return clazz.newInstance();
|
||||
} catch (final InstantiationException | IllegalAccessException ex) {
|
||||
throw new ServiceLoaderInstantiationException(clazz, ex);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package io.dynamic.threadpool.starter.spi.exception;
|
||||
|
||||
/**
|
||||
* Service loader instantiation exception.
|
||||
*
|
||||
* @author chen.ma
|
||||
* @date 2021/7/10 23:48
|
||||
*/
|
||||
public class ServiceLoaderInstantiationException extends RuntimeException {
|
||||
|
||||
public ServiceLoaderInstantiationException(final Class<?> clazz, final Exception cause) {
|
||||
super(String.format("Can not find public default constructor for SPI class `%s`", clazz.getName()), cause);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in new issue