我们有一个 Spring 应用程序,我想添加一个服务,该服务将使用多个线程处理 10Ks ID,但将作为后台进程而不影响生产实时性。
服务将更新数据库并发送外部提供商请求。
我不希望服务影响生产性能/计时,我想以低优先级对每个 ID 执行操作
我希望对超出此特定执行器范围的所有其他线程设置低优先级。
答案使用ThreadPoolExecutor
与我的案例更相关吗?
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, numOfWorkerThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
threadPool.setThreadFactory(new OpJobThreadFactory(Thread.NORM_PRIORITY-2));
public final static class OpJobThreadFactory implements ThreadFactory {
private int priority;
public OpJobThreadFactory(int priority) {
this(priority, true);
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, namePrefix + threadNumber.getAndIncrement());
t.setDaemon(daemon);
t.setPriority(priority);
}
}
也许甚至使用Thread.MIN_PRIORITY
或者我可以使用Executors.newCachedThreadPool()
创建一个线程池,该线程池根据需要创建新线程,但会重用以前构造的线程(当它们可用时)。这些池通常会提高执行许多短期异步任务的程序的性能。
我还应该使用Spring bean吗?因为我需要按需/请求创建池,所以似乎不需要/错误
编辑 我应该使用Spring Actuator来获取此任务还是其他监控工具?
Spring Boot Actuator 模块通过提供健康检查、审计、指标收集、HTTP 跟踪等生产就绪功能来帮助您监控和管理 Spring Boot 应用程序。所有这些功能都可以通过 JMX 或 HTTP 端点访问。
达令说
慕莱坞森
相关分类