package tech.powerjob.server.common; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.atomic.AtomicLong; /** * 拒绝策略 * * @author tjq * @since 2020/11/28 */ @Slf4j public class RejectedExecutionHandlerFactory { private static final AtomicLong COUNTER = new AtomicLong(); /** * 拒绝执行,抛出 RejectedExecutionException * @param source name for log * @return A handler for tasks that cannot be executed by ThreadPool */ public static RejectedExecutionHandler newAbort(String source) { return (r, e) -> { log.error("[{}] ThreadPool[{}] overload, the task[{}] will be Abort, Maybe you need to adjust the ThreadPool config!", source, e, r); throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + source); }; } /** * 直接丢弃该任务 * @param source log name * @return A handler for tasks that cannot be executed by ThreadPool */ public static RejectedExecutionHandler newDiscard(String source) { return (r, p) -> { log.error("[{}] ThreadPool[{}] overload, the task[{}] will be Discard, Maybe you need to adjust the ThreadPool config!", source, p, r); }; } /** * 调用线程运行 * @param source log name * @return A handler for tasks that cannot be executed by ThreadPool */ public static RejectedExecutionHandler newCallerRun(String source) { return (r, p) -> { log.error("[{}] ThreadPool[{}] overload, the task[{}] will run by caller thread, Maybe you need to adjust the ThreadPool config!", source, p, r); if (!p.isShutdown()) { r.run(); } }; } /** * 新线程运行 * @param source log name * @return A handler for tasks that cannot be executed by ThreadPool */ public static RejectedExecutionHandler newThreadRun(String source) { return (r, p) -> { log.error("[{}] ThreadPool[{}] overload, the task[{}] will run by a new thread!, Maybe you need to adjust the ThreadPool config!", source, p, r); if (!p.isShutdown()) { String threadName = source + "-T-" + COUNTER.getAndIncrement(); log.info("[{}] create new thread[{}] to run job", source, threadName); new Thread(r, threadName).start(); } }; } }