自定义拒绝策略Java代码
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
private static final Logger logger = Logger.getLogger(CustomRejectedExecutionHandler.class.getName());
private final BlockingQueue<Runnable> queue;
private final ThreadPoolExecutor executor;
public CustomRejectedExecutionHandler(BlockingQueue<Runnable> queue, ThreadPoolExecutor executor) {
this.queue = queue;
this.executor = executor;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
logger.log(Level.SEVERE, "订单任务被拒绝: " + r.toString());
// 尝试10分钟后重新提交任务
new Thread(() -> {
try {
Thread.sleep(10 * 60 * 1000);
if (!executor.isShutdown()) {
queue.offer(r);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
}
}
在订单处理系统中这样设计的好处
- 任务不丢失:通过记录日志和尝试重新提交任务,确保订单任务不会因为线程池饱和而丢失,保证了订单处理的完整性。
- 提高系统可靠性:即使在高并发情况下线程池饱和,系统也能尽力处理所有订单,增强了系统在压力下的可靠性。
- 可追溯性:将被拒绝的订单任务记录到日志中,方便后续排查问题和分析系统性能瓶颈。