[英]How to set @Async methods thread priority - spring-boot?
I have this async method in Spring Boot:我在 Spring Boot 中有这个异步方法:
@Async
public void calculateResult(List matrix) {
//do calculation
}
This method is invoked at the controller.此方法在 controller 调用。
I want to reduce the priority of this calculation method threads.我想降低这个计算方法线程的优先级。 How do I do that?
我怎么做?
With async anotation u can not acheive this.使用异步注释你无法实现这一点。
@Async
take only custom task executor.. No way to set priority. @Async
只接受自定义任务执行器。没有办法设置优先级。 But u can do it manualy like this:但是你可以像这样手动完成:
Create this bean:创建这个bean:
@Bean("CustomTaskExecutor")
public TaskExecutor threadPoolTaskExecutor(
@Value("${spring.async.core-pool-size}") int corePoolSize,
@Value("${spring.async.max-pool-size}") int maxPoolSize,
@Value("${spring.async.queue-capacity}") int queueCapacity) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor() {
@Override
protected BlockingQueue<Runnable> createQueue(int queueCapacity) {
return new PriorityBlockingQueue<Runnable>(queueCapacity);
}
};
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
return executor;
}
Task with priorities:优先任务:
public class Task implements Runnable {
private Consumer<Job> jobConsumer;
private Job job;
public Job getJob() {
return this.job;
}
public Task(Consumer<Job> jobConsumer, Job job) {
this.jobConsumer = jobConsumer;
this.job = job;
}
@Override
public void run() {
this.jobConsumer.accept(job);
}
}
Future custom task:未来的自定义任务:
public class FutureCustomTask extends FutureTask<FutureCustomTask> implements Comparable<FutureCustomTask> {
private Task task;
public FutureCustomTask(Task task) {
super(task, null);
this.task = task;
}
@Override
public int compareTo(FutureCustomTask o) {
return task.getJob().getPriority().compareTo(o.task.getJob().getPriority());
}
}
Finaly set priority like this:最后设置优先级如下:
@Autowired
private TaskExecutor taskExecutor;
@Autowired
private JobBusiness jobBusiness;
...
Task task = new Task(jobBusiness::performSomethingOn, job);
taskExecutor.execute(new FutureCustomTask(task));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.