refactor: fix code docs and make DefaultThreadPoolPluginRegistry thread-safe on read operation

pull/836/head
huangchengxing 3 years ago
parent 1b8c0aa886
commit 82b9261556

@ -19,6 +19,7 @@ package cn.hippo4j.core.plugin;
import cn.hippo4j.common.toolkit.Assert;
import lombok.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.*;
import java.util.concurrent.locks.Lock;
@ -83,32 +84,32 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
/**
* Register a {@link ThreadPoolPlugin}
*
* @param aware aware
* @param plugin plugin
* @throws IllegalArgumentException thrown when a plugin with the same {@link ThreadPoolPlugin#getId()} already exists in the registry
* @see ThreadPoolPlugin#getId()
*/
@Override
public void register(@NonNull ThreadPoolPlugin aware) {
public void register(@NonNull ThreadPoolPlugin plugin) {
Lock writeLock = instanceLock.writeLock();
writeLock.lock();
try {
String id = aware.getId();
String id = plugin.getId();
Assert.isTrue(!isRegistered(id), "The plug-in with id [" + id + "] has been registered");
// register aware
registeredPlugins.put(id, aware);
// register plugin
registeredPlugins.put(id, plugin);
// quick index
if (aware instanceof TaskAwarePlugin) {
taskAwarePluginList.add((TaskAwarePlugin) aware);
if (plugin instanceof TaskAwarePlugin) {
taskAwarePluginList.add((TaskAwarePlugin)plugin);
}
if (aware instanceof ExecuteAwarePlugin) {
executeAwarePluginList.add((ExecuteAwarePlugin) aware);
if (plugin instanceof ExecuteAwarePlugin) {
executeAwarePluginList.add((ExecuteAwarePlugin)plugin);
}
if (aware instanceof RejectedAwarePlugin) {
rejectedAwarePluginList.add((RejectedAwarePlugin) aware);
if (plugin instanceof RejectedAwarePlugin) {
rejectedAwarePluginList.add((RejectedAwarePlugin)plugin);
}
if (aware instanceof ShutdownAwarePlugin) {
shutdownAwarePluginList.add((ShutdownAwarePlugin) aware);
if (plugin instanceof ShutdownAwarePlugin) {
shutdownAwarePluginList.add((ShutdownAwarePlugin)plugin);
}
} finally {
writeLock.unlock();
@ -118,14 +119,14 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
/**
* Unregister {@link ThreadPoolPlugin}
*
* @param id name
* @param pluginId plugin id
*/
@Override
public void unregister(String id) {
public void unregister(String pluginId) {
Lock writeLock = instanceLock.writeLock();
writeLock.lock();
try {
Optional.ofNullable(id)
Optional.ofNullable(pluginId)
.map(registeredPlugins::remove)
.ifPresent(old -> {
// remove quick index if necessary
@ -150,14 +151,15 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
/**
* Whether the {@link ThreadPoolPlugin} has been registered.
*
* @param id name
* @param pluginId plugin id
* @return ture if target has been registered, false otherwise
*/
@Override
public boolean isRegistered(String id) {
public boolean isRegistered(String pluginId) {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return registeredPlugins.containsKey(id);
return registeredPlugins.containsKey(pluginId);
} finally {
readLock.unlock();
}
@ -166,29 +168,32 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
/**
* Get {@link ThreadPoolPlugin}
*
* @param id target name
* @param <A> target aware type
* @param pluginId plugin id
* @param <A> plugin type
* @return {@link ThreadPoolPlugin}, null if unregister
*/
@Nullable
@Override
@SuppressWarnings("unchecked")
public <A extends ThreadPoolPlugin> A getAware(String id) {
public <A extends ThreadPoolPlugin> A getPlugin(String pluginId) {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return (A) registeredPlugins.get(id);
return (A) registeredPlugins.get(pluginId);
} finally {
readLock.unlock();
}
}
/**
* Get execute aware list.
* Get execute plugin list.
*
* @return {@link ExecuteAwarePlugin}
*/
@Override
public Collection<ExecuteAwarePlugin> getExecuteAwareList() {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return executeAwarePluginList;
} finally {
@ -197,13 +202,14 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
}
/**
* Get rejected aware list.
* Get rejected plugin list.
*
* @return {@link RejectedAwarePlugin}
*/
@Override
public Collection<RejectedAwarePlugin> getRejectedAwareList() {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return rejectedAwarePluginList;
} finally {
@ -212,13 +218,14 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
}
/**
* Get shutdown aware list.
* Get shutdown plugin list.
*
* @return {@link ShutdownAwarePlugin}
*/
@Override
public Collection<ShutdownAwarePlugin> getShutdownAwareList() {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return shutdownAwarePluginList;
} finally {
@ -227,13 +234,14 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
}
/**
* Get shutdown aware list.
* Get shutdown plugin list.
*
* @return {@link ShutdownAwarePlugin}
*/
@Override
public Collection<TaskAwarePlugin> getTaskAwareList() {
Lock readLock = instanceLock.readLock();
readLock.lock();
try {
return taskAwarePluginList;
} finally {

@ -17,6 +17,8 @@
package cn.hippo4j.core.plugin;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Consumer;
@ -37,97 +39,98 @@ public interface ThreadPoolPluginRegistry {
/**
* Register a {@link ThreadPoolPlugin}
*
* @param aware aware
* @param plugin plugin
* @throws IllegalArgumentException thrown when a plugin with the same {@link ThreadPoolPlugin#getId()}
* already exists in the registry
* @see ThreadPoolPlugin#getId()
*/
void register(ThreadPoolPlugin aware);
void register(ThreadPoolPlugin plugin);
/**
* Whether the {@link ThreadPoolPlugin} has been registered.
*
* @param name name
* @param pluginId plugin id
* @return ture if target has been registered, false otherwise
*/
boolean isRegistered(String name);
boolean isRegistered(String pluginId);
/**
* Unregister {@link ThreadPoolPlugin}
*
* @param name name
* @param pluginId plugin id
*/
void unregister(String name);
void unregister(String pluginId);
/**
* Get {@link ThreadPoolPlugin}
*
* @param name target name
* @param pluginId plugin id
* @param <A> target aware type
* @return {@link ThreadPoolPlugin}, null if unregister
* @throws ClassCastException thrown when the object obtained by name cannot be converted to target type
*/
<A extends ThreadPoolPlugin> A getAware(String name);
@Nullable
<A extends ThreadPoolPlugin> A getPlugin(String pluginId);
/**
* Get execute aware list.
* Get execute aware plugin list.
*
* @return {@link ExecuteAwarePlugin}
*/
Collection<ExecuteAwarePlugin> getExecuteAwareList();
/**
* Get rejected aware list.
* Get rejected aware plugin list.
*
* @return {@link RejectedAwarePlugin}
*/
Collection<RejectedAwarePlugin> getRejectedAwareList();
/**
* Get shutdown aware list.
* Get shutdown aware plugin list.
*
* @return {@link ShutdownAwarePlugin}
*/
Collection<ShutdownAwarePlugin> getShutdownAwareList();
/**
* Get shutdown aware list.
* Get shutdown aware plugin list.
*
* @return {@link ShutdownAwarePlugin}
*/
Collection<TaskAwarePlugin> getTaskAwareList();
/**
* Try to get target Aware and apply operation, do nothing if is not present.
* Try to get target plugin and apply operation, do nothing if it's not present.
*
* @param name aware name
* @param pluginId plugin id
* @param targetType target type
* @param consumer operation for target aware
* @param <A> aware type
* @param consumer operation for target plugin
* @param <A> plugin type
* @return this instance
* @throws ClassCastException thrown when the object obtained by name cannot be converted to target type
*/
default <A extends ThreadPoolPlugin> ThreadPoolPluginRegistry getAndThen(
String name, Class<A> targetType, Consumer<A> consumer) {
Optional.ofNullable(getAware(name))
String pluginId, Class<A> targetType, Consumer<A> consumer) {
Optional.ofNullable(getPlugin(pluginId))
.map(targetType::cast)
.ifPresent(consumer);
return this;
}
/**
* Try to get target Aware and return value of apply function, return default value if is not present.
* Try to get target plugin and return value of apply function, return default value if it's not present.
*
* @param name aware name
* @param pluginId plugin id
* @param targetType target type
* @param function operation for target aware
* @param function operation for target plugin
* @param defaultValue default value
* @param <A> aware type
* @return value of apply function, default value if aware is not present
* @param <A> plugin type
* @return value of apply function, default value if plugin is not present
* @throws ClassCastException thrown when the object obtained by name cannot be converted to target type
*/
default <A extends ThreadPoolPlugin, R> R getAndThen(String name, Class<A> targetType, Function<A, R> function, R defaultValue) {
return Optional.ofNullable(getAware(name))
default <A extends ThreadPoolPlugin, R> R getAndThen(String pluginId, Class<A> targetType, Function<A, R> function, R defaultValue) {
return Optional.ofNullable(getPlugin(pluginId))
.map(targetType::cast)
.map(function)
.orElse(defaultValue);

@ -1,6 +1,7 @@
package cn.hippo4j.core.plugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Collection;
@ -30,44 +31,45 @@ public interface ThreadPoolPluginRegistryDelegate extends ThreadPoolPluginRegist
/**
* Register a {@link ThreadPoolPlugin}
*
* @param aware aware
* @param plugin aware
*/
@Override
default void register(ThreadPoolPlugin aware) {
getThreadPoolPluginRegistry().register(aware);
default void register(ThreadPoolPlugin plugin) {
getThreadPoolPluginRegistry().register(plugin);
}
/**
* Whether the {@link ThreadPoolPlugin} has been registered.
*
* @param name name
* @param pluginId name
* @return ture if target has been registered, false otherwise
*/
@Override
default boolean isRegistered(String name) {
return getThreadPoolPluginRegistry().isRegistered(name);
default boolean isRegistered(String pluginId) {
return getThreadPoolPluginRegistry().isRegistered(pluginId);
}
/**
* Unregister {@link ThreadPoolPlugin}
*
* @param name name
* @param pluginId name
*/
@Override
default void unregister(String name) {
getThreadPoolPluginRegistry().unregister(name);
default void unregister(String pluginId) {
getThreadPoolPluginRegistry().unregister(pluginId);
}
/**
* Get {@link ThreadPoolPlugin}
*
* @param name target name
* @param pluginId target name
* @return {@link ThreadPoolPlugin}, null if unregister
* @throws ClassCastException thrown when the object obtained by name cannot be converted to target type
*/
@Nullable
@Override
default <A extends ThreadPoolPlugin> A getAware(String name) {
return getThreadPoolPluginRegistry().getAware(name);
default <A extends ThreadPoolPlugin> A getPlugin(String pluginId) {
return getThreadPoolPluginRegistry().getPlugin(pluginId);
}
/**

Loading…
Cancel
Save