optimize: fix StyleCheck errors for hippo4j-threadpool-core (#1289)

* optimize: fix StyleCheck errors for hippo4j-threadpool-core

* add TaskTimeRecordPlugin#TableSizeFor test method
pull/1293/head
Dmego 2 years ago committed by GitHub
parent 80fd519a7b
commit 19d4a85777
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -131,4 +131,6 @@ public class Constants {
public static final String CLIENT_VERSION = "Client-Version"; public static final String CLIENT_VERSION = "Client-Version";
public static final String CONFIGURATION_PROPERTIES_PREFIX = "spring.dynamic.thread-pool"; public static final String CONFIGURATION_PROPERTIES_PREFIX = "spring.dynamic.thread-pool";
public static final long NO_REJECT_COUNT_NUM = -1L;
} }

@ -70,6 +70,9 @@ public class BeforeCheckConfiguration {
return new BeforeCheckConfiguration.BeforeCheck(); return new BeforeCheckConfiguration.BeforeCheck();
} }
/**
* Before check.
*/
public class BeforeCheck { public class BeforeCheck {
} }

@ -31,6 +31,9 @@ public class MarkerConfiguration {
return new Marker(); return new Marker();
} }
/**
* Marker.
*/
public class Marker { public class Marker {
} }

@ -40,6 +40,8 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import static cn.hippo4j.common.constant.Constants.NO_REJECT_COUNT_NUM;
/** /**
* Enhanced dynamic and monitored thread pool. * Enhanced dynamic and monitored thread pool.
*/ */
@ -57,7 +59,17 @@ public class DynamicThreadPoolExecutor extends ExtensibleThreadPoolExecutor impl
*/ */
@Getter @Getter
@Setter @Setter
public boolean waitForTasksToCompleteOnShutdown; private boolean waitForTasksToCompleteOnShutdown;
/**
* The default await termination millis
*/
private static final Long DEFAULT_AWAIT_TERMINATION_MILLIS = -1L;
/**
* The default execute timeout
*/
private static final Long DEFAULT_EXECUTE_TIMEOUT = -1L;
/** /**
* Creates a new {@code DynamicThreadPoolExecutor} with the given initial parameters. * Creates a new {@code DynamicThreadPoolExecutor} with the given initial parameters.
@ -149,7 +161,7 @@ public class DynamicThreadPoolExecutor extends ExtensibleThreadPoolExecutor impl
public long getAwaitTerminationMillis() { public long getAwaitTerminationMillis() {
return getPluginOfType(ThreadPoolExecutorShutdownPlugin.PLUGIN_NAME, ThreadPoolExecutorShutdownPlugin.class) return getPluginOfType(ThreadPoolExecutorShutdownPlugin.PLUGIN_NAME, ThreadPoolExecutorShutdownPlugin.class)
.map(ThreadPoolExecutorShutdownPlugin::getAwaitTerminationMillis) .map(ThreadPoolExecutorShutdownPlugin::getAwaitTerminationMillis)
.orElse(-1L); .orElse(DEFAULT_AWAIT_TERMINATION_MILLIS);
} }
/** /**
@ -176,7 +188,7 @@ public class DynamicThreadPoolExecutor extends ExtensibleThreadPoolExecutor impl
public Long getRejectCountNum() { public Long getRejectCountNum() {
return getPluginOfType(TaskRejectCountRecordPlugin.PLUGIN_NAME, TaskRejectCountRecordPlugin.class) return getPluginOfType(TaskRejectCountRecordPlugin.PLUGIN_NAME, TaskRejectCountRecordPlugin.class)
.map(TaskRejectCountRecordPlugin::getRejectCountNum) .map(TaskRejectCountRecordPlugin::getRejectCountNum)
.orElse(-1L); .orElse(NO_REJECT_COUNT_NUM);
} }
/** /**
@ -201,7 +213,7 @@ public class DynamicThreadPoolExecutor extends ExtensibleThreadPoolExecutor impl
public Long getExecuteTimeOut() { public Long getExecuteTimeOut() {
return getPluginOfType(TaskTimeoutNotifyAlarmPlugin.PLUGIN_NAME, TaskTimeoutNotifyAlarmPlugin.class) return getPluginOfType(TaskTimeoutNotifyAlarmPlugin.PLUGIN_NAME, TaskTimeoutNotifyAlarmPlugin.class)
.map(TaskTimeoutNotifyAlarmPlugin::getExecuteTimeOut) .map(TaskTimeoutNotifyAlarmPlugin::getExecuteTimeOut)
.orElse(-1L); .orElse(DEFAULT_EXECUTE_TIMEOUT);
} }
/** /**

@ -29,6 +29,8 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import static cn.hippo4j.common.constant.Constants.NO_REJECT_COUNT_NUM;
/** /**
* Abstract threadPool runtime info. * Abstract threadPool runtime info.
*/ */
@ -66,7 +68,7 @@ public abstract class AbstractThreadPoolRuntime {
int activeCount = actualExecutor.getActiveCount(); int activeCount = actualExecutor.getActiveCount();
int largestPoolSize = actualExecutor.getLargestPoolSize(); int largestPoolSize = actualExecutor.getLargestPoolSize();
BlockingQueue<Runnable> blockingQueue = actualExecutor.getQueue(); BlockingQueue<Runnable> blockingQueue = actualExecutor.getQueue();
long rejectCount = actualExecutor instanceof DynamicThreadPoolExecutor ? ((DynamicThreadPoolExecutor) actualExecutor).getRejectCountNum() : -1L; long rejectCount = actualExecutor instanceof DynamicThreadPoolExecutor ? ((DynamicThreadPoolExecutor) actualExecutor).getRejectCountNum() : NO_REJECT_COUNT_NUM;
ThreadPoolRunStateInfo stateInfo = ThreadPoolRunStateInfo.builder() ThreadPoolRunStateInfo stateInfo = ThreadPoolRunStateInfo.builder()
.tpId(threadPoolId) .tpId(threadPoolId)
.activeSize(activeCount) .activeSize(activeCount)

@ -44,9 +44,9 @@ public abstract class AbstractDynamicExecutorSupport extends ThreadPoolExecutor
private ExecutorService executor; private ExecutorService executor;
public long awaitTerminationMillis; private long awaitTerminationMillis;
public boolean waitForTasksToCompleteOnShutdown; private boolean waitForTasksToCompleteOnShutdown;
public AbstractDynamicExecutorSupport(int corePoolSize, public AbstractDynamicExecutorSupport(int corePoolSize,
int maximumPoolSize, int maximumPoolSize,

@ -33,7 +33,7 @@ import java.util.concurrent.Executor;
*/ */
public class DynamicThreadPoolAdapterChoose { public class DynamicThreadPoolAdapterChoose {
private static List<DynamicThreadPoolAdapter> DYNAMIC_THREAD_POOL_ADAPTERS = new ArrayList<>(); private static final List<DynamicThreadPoolAdapter> DYNAMIC_THREAD_POOL_ADAPTERS = new ArrayList<>();
static { static {
DYNAMIC_THREAD_POOL_ADAPTERS.add(new TransmittableThreadLocalExecutorAdapter()); DYNAMIC_THREAD_POOL_ADAPTERS.add(new TransmittableThreadLocalExecutorAdapter());

@ -46,7 +46,7 @@ public class ThreadPoolTaskExecutorAdapter implements DynamicThreadPoolAdapter {
private static final String QUEUE_CAPACITY = "queueCapacity"; private static final String QUEUE_CAPACITY = "queueCapacity";
private static String MATCH_CLASS_NAME = "ThreadPoolTaskExecutor"; private static final String MATCH_CLASS_NAME = "ThreadPoolTaskExecutor";
@Override @Override
public boolean match(Object executor) { public boolean match(Object executor) {

@ -28,9 +28,9 @@ import java.util.concurrent.Executor;
*/ */
public class TransmittableThreadLocalExecutorAdapter implements DynamicThreadPoolAdapter { public class TransmittableThreadLocalExecutorAdapter implements DynamicThreadPoolAdapter {
private static String MATCH_CLASS_NAME = "ExecutorTtlWrapper"; private static final String MATCH_CLASS_NAME = "ExecutorTtlWrapper";
private static String FIELD_NAME = "executor"; private static final String FIELD_NAME = "executor";
@Override @Override
public boolean match(Object executor) { public boolean match(Object executor) {

@ -28,9 +28,9 @@ import java.util.concurrent.Executor;
*/ */
public class TransmittableThreadLocalExecutorServiceAdapter implements DynamicThreadPoolAdapter { public class TransmittableThreadLocalExecutorServiceAdapter implements DynamicThreadPoolAdapter {
private static String MATCH_CLASS_NAME = "ExecutorServiceTtlWrapper"; private static final String MATCH_CLASS_NAME = "ExecutorServiceTtlWrapper";
private static String FIELD_NAME = "executorService"; private static final String FIELD_NAME = "executorService";
@Override @Override
public boolean match(Object executor) { public boolean match(Object executor) {

@ -31,9 +31,9 @@ import java.util.concurrent.Executor;
*/ */
public class ZipkinExecutorAdapter implements DynamicThreadPoolAdapter { public class ZipkinExecutorAdapter implements DynamicThreadPoolAdapter {
private final static String MATCH_CLASS_NAME = "brave.internal.WrappingExecutorService"; private static final String MATCH_CLASS_NAME = "brave.internal.WrappingExecutorService";
private final static String FIELD_NAME = "delegate"; private static final String FIELD_NAME = "delegate";
private final static String TYPE_NAME = "java.util.concurrent.ExecutorService"; private static final String TYPE_NAME = "java.util.concurrent.ExecutorService";
@Override @Override
public boolean match(Object executor) { public boolean match(Object executor) {

@ -34,13 +34,13 @@ public class DynamicThreadPoolBannerHandler implements InitializingBean {
private final BootstrapPropertiesInterface properties; private final BootstrapPropertiesInterface properties;
private final String DYNAMIC_THREAD_POOL = " :: Dynamic ThreadPool :: "; private static final String DYNAMIC_THREAD_POOL = " :: Dynamic ThreadPool :: ";
private final String HIPPO4J_GITHUB = "GitHub: https://github.com/opengoofy/hippo4j"; private static final String HIPPO4J_GITHUB = "GitHub: https://github.com/opengoofy/hippo4j";
private final String HIPPO4J_SITE = "Site: https://www.hippo4j.cn"; private static final String HIPPO4J_SITE = "Site: https://www.hippo4j.cn";
private final int STRAP_LINE_SIZE = 50; private static final int STRAP_LINE_SIZE = 50;
private final String version; private final String version;
@ -70,7 +70,7 @@ public class DynamicThreadPoolBannerHandler implements InitializingBean {
while (padding.length() < STRAP_LINE_SIZE - (bannerVersion.length() + DYNAMIC_THREAD_POOL.length())) { while (padding.length() < STRAP_LINE_SIZE - (bannerVersion.length() + DYNAMIC_THREAD_POOL.length())) {
padding.append(" "); padding.append(" ");
} }
System.out.println(AnsiOutput.toString(banner, AnsiColor.GREEN, DYNAMIC_THREAD_POOL, AnsiColor.DEFAULT, log.info(AnsiOutput.toString("\n", banner, AnsiColor.GREEN, DYNAMIC_THREAD_POOL, AnsiColor.DEFAULT,
padding.toString(), AnsiStyle.FAINT, bannerVersion, "\n\n", HIPPO4J_GITHUB, "\n", HIPPO4J_SITE, "\n")); padding.toString(), AnsiStyle.FAINT, bannerVersion, "\n\n", HIPPO4J_GITHUB, "\n", HIPPO4J_SITE, "\n"));
} }

@ -39,7 +39,14 @@ import java.util.stream.Collectors;
*/ */
public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin { public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin {
private static final int MAXIMUM_CAPACITY = 1 << 30; /**
* maximumCapacity: 1 << 30
*/
private static final int MAXIMUM_CAPACITY = 1073741824;
/**
* pluginName.
*/
public static final String PLUGIN_NAME = TaskTimeRecordPlugin.class.getSimpleName(); public static final String PLUGIN_NAME = TaskTimeRecordPlugin.class.getSimpleName();
/** /**
@ -50,7 +57,22 @@ public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin {
/** /**
* timers * timers
*/ */
public final Timer[] timerTable; private final Timer[] timerTable;
/**
* The default time mills
*/
private static final long DEFAULT_TIME_MILLS = -1L;
/**
* No task count
*/
private static final long NO_TASK_COUNT = -1L;
/**
* All bits are values of 1
*/
private static final int ALL_BIT_IS_ONE = -1;
/** /**
* Create a {@link TaskTimeRecordPlugin} * Create a {@link TaskTimeRecordPlugin}
@ -116,8 +138,8 @@ public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin {
// summarize data // summarize data
long totalTaskTimeMillis = 0L; long totalTaskTimeMillis = 0L;
long maxTaskTimeMillis = -1L; long maxTaskTimeMillis = DEFAULT_TIME_MILLS;
long minTaskTimeMillis = -1L; long minTaskTimeMillis = DEFAULT_TIME_MILLS;
long taskCount = 0L; long taskCount = 0L;
for (Summary summary : summaries) { for (Summary summary : summaries) {
if (taskCount > 0) { if (taskCount > 0) {
@ -147,13 +169,8 @@ public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin {
* copy from {@link HashMap#tableSizeFor} * copy from {@link HashMap#tableSizeFor}
*/ */
static int tableSizeFor(int cap) { static int tableSizeFor(int cap) {
int n = cap - 1; int n = ALL_BIT_IS_ONE >>> Integer.numberOfLeadingZeros(cap - 1);
n |= n >>> 1; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return n >= MAXIMUM_CAPACITY ? MAXIMUM_CAPACITY : n + 1;
} }
/** /**
@ -267,7 +284,7 @@ public class TaskTimeRecordPlugin extends AbstractTaskTimerPlugin {
*/ */
public long getAvgTaskTimeMillis() { public long getAvgTaskTimeMillis() {
long totalTaskCount = getTaskCount(); long totalTaskCount = getTaskCount();
return totalTaskCount > 0L ? getTotalTaskTimeMillis() / totalTaskCount : -1; return totalTaskCount > 0L ? getTotalTaskTimeMillis() / totalTaskCount : NO_TASK_COUNT;
} }
} }

@ -51,7 +51,7 @@ public class ThreadPoolExecutorShutdownPlugin implements ShutdownAwarePlugin {
* Await termination millis * Await termination millis
*/ */
@Setter @Setter
public long awaitTerminationMillis; private long awaitTerminationMillis;
/** /**
* Callback before pool shutdown. * Callback before pool shutdown.

@ -28,6 +28,23 @@ import java.util.concurrent.TimeUnit;
*/ */
public class CommonDynamicThreadPoolProviderFactory { public class CommonDynamicThreadPoolProviderFactory {
/**
* Core pool size.
*/
private static final int CORE_POOL_SIZE = 2;
/**
* Maximum pool size.
*/
private static final int MAXIMUM_POOL_SIZE = 4;
/**
* Keep alive time.
*/
private static final long KEEP_ALIVE_TIME = 60L;
/**
* Work queue capacity.
*/
private static final int WORK_QUEUE_CAPACITY = 1024;
/** /**
* Get the public dynamic thread pool instance. * Get the public dynamic thread pool instance.
* *
@ -38,9 +55,9 @@ public class CommonDynamicThreadPoolProviderFactory {
DynamicThreadPoolExecutor dynamicThreadPoolExecutor = (DynamicThreadPoolExecutor) ThreadPoolBuilder.builder() DynamicThreadPoolExecutor dynamicThreadPoolExecutor = (DynamicThreadPoolExecutor) ThreadPoolBuilder.builder()
.dynamicPool() .dynamicPool()
.threadFactory(threadPoolId) .threadFactory(threadPoolId)
.poolThreadSize(2, 4) .poolThreadSize(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE)
.keepAliveTime(60L, TimeUnit.SECONDS) .keepAliveTime(KEEP_ALIVE_TIME, TimeUnit.SECONDS)
.workQueue(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE, 1024) .workQueue(BlockingQueueTypeEnum.RESIZABLE_LINKED_BLOCKING_QUEUE, WORK_QUEUE_CAPACITY)
.build(); .build();
return dynamicThreadPoolExecutor; return dynamicThreadPoolExecutor;
} }

@ -29,7 +29,7 @@ public class ExecutorTraceContextUtil {
/** /**
* Execute timeout trace key. * Execute timeout trace key.
*/ */
private static String EXECUTE_TIMEOUT_TRACE_KEY = EXECUTE_TIMEOUT_TRACE; private static String executeTimeoutTraceKey = EXECUTE_TIMEOUT_TRACE;
/** /**
* Get and remove. * Get and remove.
@ -37,8 +37,8 @@ public class ExecutorTraceContextUtil {
* @return timeout trace * @return timeout trace
*/ */
public static String getAndRemoveTimeoutTrace() { public static String getAndRemoveTimeoutTrace() {
String val = MDC.get(EXECUTE_TIMEOUT_TRACE_KEY); String val = MDC.get(executeTimeoutTraceKey);
MDC.remove(EXECUTE_TIMEOUT_TRACE_KEY); MDC.remove(executeTimeoutTraceKey);
return val; return val;
} }
@ -57,6 +57,6 @@ public class ExecutorTraceContextUtil {
* @param key trace key * @param key trace key
*/ */
public static void setTimeoutTraceKey(String key) { public static void setTimeoutTraceKey(String key) {
EXECUTE_TIMEOUT_TRACE_KEY = key; executeTimeoutTraceKey = key;
} }
} }

@ -45,13 +45,18 @@ public class IdentifyUtil {
/** /**
* Identify * Identify
*/ */
private static String IDENTIFY; private static String identify;
/** /**
* Client identification value * Client identification value
*/ */
public static final String CLIENT_IDENTIFICATION_VALUE = IdUtil.simpleUUID(); public static final String CLIENT_IDENTIFICATION_VALUE = IdUtil.simpleUUID();
/**
* Get identify sleep time
*/
private static final int SLEEP_TIME = 500;
/** /**
* Generate identify. * Generate identify.
* *
@ -60,8 +65,8 @@ public class IdentifyUtil {
* @return identify * @return identify
*/ */
public static synchronized String generate(ConfigurableEnvironment environment, InetUtils inetUtil) { public static synchronized String generate(ConfigurableEnvironment environment, InetUtils inetUtil) {
if (StringUtil.isNotBlank(IDENTIFY)) { if (StringUtil.isNotBlank(identify)) {
return IDENTIFY; return identify;
} }
String[] customerNetwork = ServiceLoaderRegistry.getSingletonServiceInstances(ClientNetworkService.class) String[] customerNetwork = ServiceLoaderRegistry.getSingletonServiceInstances(ClientNetworkService.class)
.stream().findFirst().map(each -> each.getNetworkIpPort(environment)).orElse(null); .stream().findFirst().map(each -> each.getNetworkIpPort(environment)).orElse(null);
@ -79,7 +84,7 @@ public class IdentifyUtil {
+ port + port
+ IDENTIFY_SLICER_SYMBOL + IDENTIFY_SLICER_SYMBOL
+ CLIENT_IDENTIFICATION_VALUE; + CLIENT_IDENTIFICATION_VALUE;
IDENTIFY = identify; identify = identify;
return identify; return identify;
} }
@ -89,16 +94,16 @@ public class IdentifyUtil {
* @return identify * @return identify
*/ */
public static String getIdentify() { public static String getIdentify() {
while (StringUtil.isBlank(IDENTIFY)) { while (StringUtil.isBlank(identify)) {
ConfigurableEnvironment environment = ApplicationContextHolder.getBean(ConfigurableEnvironment.class); ConfigurableEnvironment environment = ApplicationContextHolder.getBean(ConfigurableEnvironment.class);
InetUtils inetUtils = ApplicationContextHolder.getBean(InetUtils.class); InetUtils inetUtils = ApplicationContextHolder.getBean(InetUtils.class);
if (environment != null && inetUtils != null) { if (environment != null && inetUtils != null) {
String identify = generate(environment, inetUtils); String identify = generate(environment, inetUtils);
return identify; return identify;
} }
ThreadUtil.sleep(500); ThreadUtil.sleep(SLEEP_TIME);
} }
return IDENTIFY; return identify;
} }
/** /**

@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicLong;
* System clock.<br> * System clock.<br>
* Refer to cn.hutool.core.date.SystemClock<br> * Refer to cn.hutool.core.date.SystemClock<br>
*/ */
public class SystemClock { public final class SystemClock {
/** /**
* Period * Period

@ -168,7 +168,7 @@ public class InetUtils implements Closeable {
/** /**
* Should override the host info. * Should override the host info.
*/ */
public boolean override; private boolean override;
private String ipAddress; private String ipAddress;

@ -80,4 +80,24 @@ public class TaskTimeRecordPluginTest {
return exceptLower < actual && actual < exceptUpper; return exceptLower < actual && actual < exceptUpper;
} }
@Test
public void testTableSizeFor() {
int maxCap = 1 << 30;
for (int i = 0; i <= maxCap; i++) {
int tabSize1 = tabSizeFor_JDK8(i);
int tabSize2 = TaskTimeRecordPlugin.tableSizeFor(i);
Assert.assertTrue(tabSize1 == tabSize2);
}
}
private static int tabSizeFor_JDK8(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= 1073741824) ? 1073741824 : n + 1;
}
} }

Loading…
Cancel
Save