Как установить приоритет потока методов @ Asyn c - spring-boot? - PullRequest
4 голосов
/ 29 апреля 2020

У меня есть этот метод asyn c в Spring Boot:

@Async
public void calculateResult(List matrix) {
    //do calculation
}

Этот метод вызывается на контроллере

Я хочу уменьшить приоритет потоков этого метода вычисления. Как мне это сделать?

1 Ответ

2 голосов
/ 29 апреля 2020

С аннотацией asyn c Вы не можете этого достичь. @Async принимать только пользовательское задание исполнителя. Нет способа установить приоритет. Но вы можете сделать это вручную следующим образом:

Создать этот компонент:

@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;
  }

Задача с приоритетами:

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);
      }
    }

Будущее пользовательская задача:

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());
  }
}

Окончательно установить приоритет следующим образом:

@Autowired
private TaskExecutor taskExecutor;
@Autowired
private JobBusiness jobBusiness;
...
Task task = new Task(jobBusiness::performSomethingOn, job);
taskExecutor.execute(new FutureCustomTask(task));

Я получил этот ответ от здесь

Смотрите также этот учебник также .. ..

...