mirror of https://github.com/longtai-cn/hippo4j
parent
54b0adb695
commit
9396b28535
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.impl;
|
||||||
|
|
||||||
|
import cn.hippo4j.core.executor.ExtensibleThreadPoolExecutor;
|
||||||
|
import cn.hippo4j.core.plugin.PluginRuntime;
|
||||||
|
import cn.hippo4j.core.plugin.TaskAwarePlugin;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import org.springframework.core.task.TaskDecorator;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decorate tasks when they are submitted to thread-pool.
|
||||||
|
*/
|
||||||
|
public class TaskDecoratorPlugin implements TaskAwarePlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_NAME = "task-decorator-plugin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return PLUGIN_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* decorators
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final List<TaskDecorator> decorators = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback when task is executed.
|
||||||
|
*
|
||||||
|
* @param runnable runnable
|
||||||
|
* @return tasks to be execute
|
||||||
|
* @see ExtensibleThreadPoolExecutor#execute
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Runnable beforeTaskExecute(Runnable runnable) {
|
||||||
|
for (TaskDecorator decorator : decorators) {
|
||||||
|
runnable = decorator.decorate(runnable);
|
||||||
|
}
|
||||||
|
return runnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin runtime info.
|
||||||
|
*
|
||||||
|
* @return plugin runtime info
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PluginRuntime getPluginRuntime() {
|
||||||
|
return new PluginRuntime(getId())
|
||||||
|
.addInfo("decorators", decorators);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a decorator
|
||||||
|
*
|
||||||
|
* @param decorator decorator
|
||||||
|
*/
|
||||||
|
public void addDecorator(@NonNull TaskDecorator decorator) {
|
||||||
|
decorators.remove(decorator);
|
||||||
|
decorators.add(decorator);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all decorators
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void clearDecorators() {
|
||||||
|
decorators.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove decorators
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void removeDecorator(TaskDecorator decorator) {
|
||||||
|
decorators.remove(decorator);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.impl;
|
||||||
|
|
||||||
|
import cn.hippo4j.core.plugin.PluginRuntime;
|
||||||
|
import cn.hippo4j.core.plugin.RejectedAwarePlugin;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record the number of tasks rejected by the thread pool.
|
||||||
|
*/
|
||||||
|
public class TaskRejectCountRecordPlugin implements RejectedAwarePlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_NAME = "task-reject-count-record-plugin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return PLUGIN_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rejection count
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
private AtomicLong rejectCount = new AtomicLong(0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin runtime info.
|
||||||
|
*
|
||||||
|
* @return plugin runtime info
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PluginRuntime getPluginRuntime() {
|
||||||
|
return new PluginRuntime(getId())
|
||||||
|
.addInfo("rejectCount", getRejectCountNum());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record rejection count.
|
||||||
|
*
|
||||||
|
* @param r task
|
||||||
|
* @param executor executor
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void beforeRejectedExecution(Runnable r, ThreadPoolExecutor executor) {
|
||||||
|
rejectCount.incrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get reject count num
|
||||||
|
*
|
||||||
|
* @return reject count num
|
||||||
|
*/
|
||||||
|
public Long getRejectCountNum() {
|
||||||
|
return rejectCount.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.impl;
|
||||||
|
|
||||||
|
import cn.hippo4j.common.config.ApplicationContextHolder;
|
||||||
|
import cn.hippo4j.core.executor.ExtensibleThreadPoolExecutor;
|
||||||
|
import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
|
||||||
|
import cn.hippo4j.core.plugin.RejectedAwarePlugin;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send alert notification when a task is rejected.
|
||||||
|
*/
|
||||||
|
public class TaskRejectNotifyAlarmPlugin implements RejectedAwarePlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_NAME = "task-reject-notify-alarm-plugin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return PLUGIN_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback before task is rejected.
|
||||||
|
*
|
||||||
|
* @param runnable task
|
||||||
|
* @param executor executor
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void beforeRejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {
|
||||||
|
if (!(executor instanceof ExtensibleThreadPoolExecutor)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String threadPoolId = ((ExtensibleThreadPoolExecutor) executor).getThreadPoolId();
|
||||||
|
Optional.ofNullable(ApplicationContextHolder.getInstance())
|
||||||
|
.map(context -> context.getBean(ThreadPoolNotifyAlarmHandler.class))
|
||||||
|
.ifPresent(handler -> handler.asyncSendRejectedAlarm(threadPoolId));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.impl;
|
||||||
|
|
||||||
|
import cn.hippo4j.core.executor.ExtensibleThreadPoolExecutor;
|
||||||
|
import cn.hippo4j.core.plugin.ExecuteAwarePlugin;
|
||||||
|
import cn.hippo4j.core.plugin.PluginRuntime;
|
||||||
|
import cn.hippo4j.core.toolkit.SystemClock;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record task execution time indicator.
|
||||||
|
*
|
||||||
|
* @see TaskTimeoutNotifyAlarmPlugin
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class TaskTimeRecordPlugin implements ExecuteAwarePlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_NAME = "task-time-record-plugin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock instance.
|
||||||
|
*/
|
||||||
|
private final ReadWriteLock lock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total execution milli time of all tasks.
|
||||||
|
*/
|
||||||
|
private long totalTaskTimeMillis = 0L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum task milli execution time, default -1.
|
||||||
|
*/
|
||||||
|
private long maxTaskTimeMillis = -1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal task milli execution time, default -1.
|
||||||
|
*/
|
||||||
|
private long minTaskTimeMillis = -1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count of completed task.
|
||||||
|
*/
|
||||||
|
private long taskCount = 0L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return PLUGIN_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start times of executed tasks
|
||||||
|
*/
|
||||||
|
private final ThreadLocal<Long> startTimes = new ThreadLocal<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record the time when the worker thread starts executing the task.
|
||||||
|
*
|
||||||
|
* @param thread thread of executing task
|
||||||
|
* @param runnable task
|
||||||
|
* @see ExtensibleThreadPoolExecutor#beforeExecute
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void beforeExecute(Thread thread, Runnable runnable) {
|
||||||
|
startTimes.set(SystemClock.now());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin runtime info.
|
||||||
|
*
|
||||||
|
* @return plugin runtime info
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PluginRuntime getPluginRuntime() {
|
||||||
|
Summary summary = summarize();
|
||||||
|
return new PluginRuntime(getId())
|
||||||
|
.addInfo("taskCount", summary.getTaskCount())
|
||||||
|
.addInfo("minTaskTime", summary.getMinTaskTimeMillis() + "ms")
|
||||||
|
.addInfo("maxTaskTime", summary.getMaxTaskTimeMillis() + "ms")
|
||||||
|
.addInfo("totalTaskTime", summary.getTotalTaskTimeMillis() + "ms")
|
||||||
|
.addInfo("avgTaskTime", summary.getAvgTaskTimeMillis() + "ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record the total time for the worker thread to complete the task, and update the time record.
|
||||||
|
*
|
||||||
|
* @param runnable runnable
|
||||||
|
* @param throwable exception thrown during execution
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void afterExecute(Runnable runnable, Throwable throwable) {
|
||||||
|
try {
|
||||||
|
Long startTime = startTimes.get();
|
||||||
|
if (Objects.isNull(startTime)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
long executeTime = SystemClock.now() - startTime;
|
||||||
|
recordTaskTime(executeTime);
|
||||||
|
} finally {
|
||||||
|
startTimes.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh time indicators of the current instance.
|
||||||
|
*
|
||||||
|
* @param taskExecutionTime millisecond
|
||||||
|
*/
|
||||||
|
protected void recordTaskTime(long taskExecutionTime) {
|
||||||
|
Lock writeLock = lock.writeLock();
|
||||||
|
writeLock.lock();
|
||||||
|
try {
|
||||||
|
if (taskCount == 0) {
|
||||||
|
maxTaskTimeMillis = taskExecutionTime;
|
||||||
|
minTaskTimeMillis = taskExecutionTime;
|
||||||
|
} else {
|
||||||
|
maxTaskTimeMillis = Math.max(taskExecutionTime, maxTaskTimeMillis);
|
||||||
|
minTaskTimeMillis = Math.min(taskExecutionTime, minTaskTimeMillis);
|
||||||
|
}
|
||||||
|
taskCount = taskCount + 1;
|
||||||
|
totalTaskTimeMillis += taskExecutionTime;
|
||||||
|
} finally {
|
||||||
|
writeLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the summary statistics of the instance at the current time.
|
||||||
|
*
|
||||||
|
* @return data snapshot
|
||||||
|
*/
|
||||||
|
public Summary summarize() {
|
||||||
|
Lock readLock = lock.readLock();
|
||||||
|
Summary statistics;
|
||||||
|
readLock.lock();
|
||||||
|
try {
|
||||||
|
statistics = new Summary(
|
||||||
|
this.totalTaskTimeMillis,
|
||||||
|
this.maxTaskTimeMillis,
|
||||||
|
this.minTaskTimeMillis,
|
||||||
|
this.taskCount);
|
||||||
|
} finally {
|
||||||
|
readLock.unlock();
|
||||||
|
}
|
||||||
|
return statistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summary statistics of SyncTimeRecorder instance at a certain time.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public static class Summary {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total execution nano time of all tasks.
|
||||||
|
*/
|
||||||
|
private final long totalTaskTimeMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum task nano execution time.
|
||||||
|
*/
|
||||||
|
private final long maxTaskTimeMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal task nano execution time.
|
||||||
|
*/
|
||||||
|
private final long minTaskTimeMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count of completed task.
|
||||||
|
*/
|
||||||
|
private final long taskCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the avg task time in milliseconds.
|
||||||
|
*
|
||||||
|
* @return avg task time
|
||||||
|
*/
|
||||||
|
public long getAvgTaskTimeMillis() {
|
||||||
|
long totalTaskCount = getTaskCount();
|
||||||
|
return totalTaskCount > 0L ? getTotalTaskTimeMillis() / totalTaskCount : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.impl;
|
||||||
|
|
||||||
|
import cn.hippo4j.common.config.ApplicationContextHolder;
|
||||||
|
import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record task execution time indicator,
|
||||||
|
* and send alarm notification when the execution time exceeds the threshold.
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class TaskTimeoutNotifyAlarmPlugin extends TaskTimeRecordPlugin {
|
||||||
|
|
||||||
|
public static final String PLUGIN_NAME = "task-timeout-notify-alarm-plugin";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* threadPoolId
|
||||||
|
*/
|
||||||
|
private final String threadPoolId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return PLUGIN_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private Long executeTimeOut;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* thread-pool
|
||||||
|
*/
|
||||||
|
private final ThreadPoolExecutor threadPoolExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the task execution time exceeds {@link #executeTimeOut},
|
||||||
|
* if it exceeds this time, send an alarm notification.
|
||||||
|
*
|
||||||
|
* @param executeTime executeTime in nanosecond
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void recordTaskTime(long executeTime) {
|
||||||
|
super.recordTaskTime(executeTime);
|
||||||
|
if (executeTime <= executeTimeOut) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Optional.ofNullable(ApplicationContextHolder.getInstance())
|
||||||
|
.map(context -> context.getBean(ThreadPoolNotifyAlarmHandler.class))
|
||||||
|
.ifPresent(handler -> handler.asyncSendExecuteTimeOutAlarm(
|
||||||
|
threadPoolId, executeTime, executeTimeOut, threadPoolExecutor));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.manager;
|
||||||
|
|
||||||
|
import cn.hippo4j.core.plugin.ThreadPoolPlugin;
|
||||||
|
import cn.hippo4j.core.plugin.impl.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register default {@link ThreadPoolPlugin}.
|
||||||
|
*
|
||||||
|
* @see TaskDecoratorPlugin
|
||||||
|
* @see TaskTimeoutNotifyAlarmPlugin
|
||||||
|
* @see TaskRejectCountRecordPlugin
|
||||||
|
* @see TaskRejectNotifyAlarmPlugin
|
||||||
|
* @see ThreadPoolExecutorShutdownPlugin
|
||||||
|
*/
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DefaultThreadPoolPluginRegistrar implements ThreadPoolPluginRegistrar {
|
||||||
|
|
||||||
|
public static final String REGISTRAR_NAME = "DefaultThreadPoolPluginRegistrar";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute time out
|
||||||
|
*/
|
||||||
|
private long executeTimeOut;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* await termination millis
|
||||||
|
*/
|
||||||
|
private long awaitTerminationMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wait for tasks to complete on shutdown
|
||||||
|
*/
|
||||||
|
private boolean waitForTasksToCompleteOnShutdown;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return REGISTRAR_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and register plugin for the specified thread-pool instance.
|
||||||
|
*
|
||||||
|
* @param support thread pool plugin manager delegate
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doRegister(ThreadPoolPluginSupport support) {
|
||||||
|
// callback when task execute
|
||||||
|
support.register(new TaskDecoratorPlugin());
|
||||||
|
support.register(new TaskTimeoutNotifyAlarmPlugin(support.getThreadPoolId(), executeTimeOut, support.getThreadPoolExecutor()));
|
||||||
|
// callback when task rejected
|
||||||
|
support.register(new TaskRejectCountRecordPlugin());
|
||||||
|
support.register(new TaskRejectNotifyAlarmPlugin());
|
||||||
|
// callback when pool shutdown
|
||||||
|
support.register(new ThreadPoolExecutorShutdownPlugin(awaitTerminationMillis, waitForTasksToCompleteOnShutdown));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.hippo4j.core.plugin.manager;
|
||||||
|
|
||||||
|
import cn.hippo4j.core.plugin.ThreadPoolPlugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registrar of {@link ThreadPoolPlugin}.
|
||||||
|
*/
|
||||||
|
public interface ThreadPoolPluginRegistrar {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get id.
|
||||||
|
* In spring container, the obtained id will be used as the alias of the bean name.
|
||||||
|
*
|
||||||
|
* @return id
|
||||||
|
*/
|
||||||
|
String getId();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and register plugin for the specified thread-pool instance.
|
||||||
|
*
|
||||||
|
* @param support thread pool plugin manager delegate
|
||||||
|
*/
|
||||||
|
void doRegister(ThreadPoolPluginSupport support);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in new issue