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

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

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

Loading…
Cancel
Save