temp commit

pull/836/head
huangchengxing 3 years ago
parent 824afc4da3
commit f101adf64f

@ -30,7 +30,7 @@ public class DefaultThreadPoolPluginRegistrar
public static final String REGISTRAR_NAME = "DefaultThreadPoolPluginRegistrar"; public static final String REGISTRAR_NAME = "DefaultThreadPoolPluginRegistrar";
/** /**
* aliasRegistry * alias registry
*/ */
private AliasRegistry aliasRegistry; private AliasRegistry aliasRegistry;

@ -21,6 +21,9 @@ import cn.hippo4j.common.toolkit.Assert;
import lombok.NonNull; import lombok.NonNull;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/** /**
* The default implementation of {@link ThreadPoolPluginRegistry}. * The default implementation of {@link ThreadPoolPluginRegistry}.
@ -29,6 +32,11 @@ import java.util.*;
*/ */
public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry { public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry {
/**
* lock of this instance
*/
private final ReadWriteLock instanceLock = new ReentrantReadWriteLock();
/** /**
* Registered {@link ThreadPoolPlugin}. * Registered {@link ThreadPoolPlugin}.
*/ */
@ -59,11 +67,17 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public synchronized void clear() { public synchronized void clear() {
registeredPlugins.clear(); Lock writeLock = instanceLock.writeLock();
taskAwarePluginList.clear(); writeLock.lock();
executeAwarePluginList.clear(); try {
rejectedAwarePluginList.clear(); registeredPlugins.clear();
shutdownAwarePluginList.clear(); taskAwarePluginList.clear();
executeAwarePluginList.clear();
rejectedAwarePluginList.clear();
shutdownAwarePluginList.clear();
} finally {
writeLock.unlock();
}
} }
/** /**
@ -74,24 +88,30 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
* @see ThreadPoolPlugin#getId() * @see ThreadPoolPlugin#getId()
*/ */
@Override @Override
public synchronized void register(@NonNull ThreadPoolPlugin aware) { public void register(@NonNull ThreadPoolPlugin aware) {
String id = aware.getId(); Lock writeLock = instanceLock.writeLock();
Assert.isTrue(!isRegistered(id), "The plug-in with id [" + id + "] has been registered"); writeLock.lock();
try {
// register aware String id = aware.getId();
registeredPlugins.put(id, aware); Assert.isTrue(!isRegistered(id), "The plug-in with id [" + id + "] has been registered");
// quick index
if (aware instanceof TaskAwarePlugin) { // register aware
taskAwarePluginList.add((TaskAwarePlugin) aware); registeredPlugins.put(id, aware);
} // quick index
if (aware instanceof ExecuteAwarePlugin) { if (aware instanceof TaskAwarePlugin) {
executeAwarePluginList.add((ExecuteAwarePlugin) aware); taskAwarePluginList.add((TaskAwarePlugin) aware);
} }
if (aware instanceof RejectedAwarePlugin) { if (aware instanceof ExecuteAwarePlugin) {
rejectedAwarePluginList.add((RejectedAwarePlugin) aware); executeAwarePluginList.add((ExecuteAwarePlugin) aware);
} }
if (aware instanceof ShutdownAwarePlugin) { if (aware instanceof RejectedAwarePlugin) {
shutdownAwarePluginList.add((ShutdownAwarePlugin) aware); rejectedAwarePluginList.add((RejectedAwarePlugin) aware);
}
if (aware instanceof ShutdownAwarePlugin) {
shutdownAwarePluginList.add((ShutdownAwarePlugin) aware);
}
} finally {
writeLock.unlock();
} }
} }
@ -101,23 +121,30 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
* @param id name * @param id name
*/ */
@Override @Override
public synchronized void unregister(String id) { public void unregister(String id) {
Optional.ofNullable(id) Lock writeLock = instanceLock.writeLock();
.map(registeredPlugins::remove) writeLock.lock();
.ifPresent(old -> { try {
if (old instanceof TaskAwarePlugin) { Optional.ofNullable(id)
taskAwarePluginList.remove(old); .map(registeredPlugins::remove)
} .ifPresent(old -> {
if (old instanceof ExecuteAwarePlugin) { // remove quick index if necessary
executeAwarePluginList.remove(old); if (old instanceof TaskAwarePlugin) {
} taskAwarePluginList.remove(old);
if (old instanceof RejectedAwarePlugin) { }
rejectedAwarePluginList.remove(old); if (old instanceof ExecuteAwarePlugin) {
} executeAwarePluginList.remove(old);
if (old instanceof ShutdownAwarePlugin) { }
shutdownAwarePluginList.remove(old); if (old instanceof RejectedAwarePlugin) {
} rejectedAwarePluginList.remove(old);
}); }
if (old instanceof ShutdownAwarePlugin) {
shutdownAwarePluginList.remove(old);
}
});
} finally {
writeLock.unlock();
}
} }
/** /**
@ -128,7 +155,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public boolean isRegistered(String id) { public boolean isRegistered(String id) {
return registeredPlugins.containsKey(id); Lock readLock = instanceLock.readLock();
try {
return registeredPlugins.containsKey(id);
} finally {
readLock.unlock();
}
} }
/** /**
@ -141,7 +173,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <A extends ThreadPoolPlugin> A getAware(String id) { public <A extends ThreadPoolPlugin> A getAware(String id) {
return (A) registeredPlugins.get(id); Lock readLock = instanceLock.readLock();
try {
return (A) registeredPlugins.get(id);
} finally {
readLock.unlock();
}
} }
/** /**
@ -151,7 +188,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public Collection<ExecuteAwarePlugin> getExecuteAwareList() { public Collection<ExecuteAwarePlugin> getExecuteAwareList() {
return executeAwarePluginList; Lock readLock = instanceLock.readLock();
try {
return executeAwarePluginList;
} finally {
readLock.unlock();
}
} }
/** /**
@ -161,7 +203,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public Collection<RejectedAwarePlugin> getRejectedAwareList() { public Collection<RejectedAwarePlugin> getRejectedAwareList() {
return rejectedAwarePluginList; Lock readLock = instanceLock.readLock();
try {
return rejectedAwarePluginList;
} finally {
readLock.unlock();
}
} }
/** /**
@ -171,7 +218,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public Collection<ShutdownAwarePlugin> getShutdownAwareList() { public Collection<ShutdownAwarePlugin> getShutdownAwareList() {
return shutdownAwarePluginList; Lock readLock = instanceLock.readLock();
try {
return shutdownAwarePluginList;
} finally {
readLock.unlock();
}
} }
/** /**
@ -181,7 +233,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry
*/ */
@Override @Override
public Collection<TaskAwarePlugin> getTaskAwareList() { public Collection<TaskAwarePlugin> getTaskAwareList() {
return taskAwarePluginList; Lock readLock = instanceLock.readLock();
try {
return taskAwarePluginList;
} finally {
readLock.unlock();
}
} }
} }

@ -11,6 +11,7 @@ public interface ThreadPoolPluginRegistrar {
/** /**
* Get id. * Get id.
* In spring container, the obtained id will be used as the alias of the bean name.
* *
* @return id * @return id
*/ */

@ -38,6 +38,9 @@ public interface ThreadPoolPluginRegistry {
* Register a {@link ThreadPoolPlugin} * Register a {@link ThreadPoolPlugin}
* *
* @param aware aware * @param aware aware
* @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 aware);

Loading…
Cancel
Save