Весенняя загрузка TaskExector замедляет выполнение API - PullRequest
0 голосов
/ 24 апреля 2020

Я использую TaskExecutor для запуска некоторых задач в фоновых потоках. Вот моя конфигурация: -

@Configuration
public class TaskExecutorConfig
{

@Bean
public TaskExecutor threadPoolTaskExecutor()
{

    ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    threadPoolTaskExecutor.setCorePoolSize(4);
    threadPoolTaskExecutor.setMaxPoolSize(100);
    threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(false);
    threadPoolTaskExecutor.setThreadNamePrefix("TaskExecutor");
    threadPoolTaskExecutor.initialize();

    return threadPoolTaskExecutor;
}

}

В фоновом режиме может выполняться много задач. Я объявил ThreadComponent реализующий Runnable класс. В этом ThreadComponent я объявил методы, которые выполняются в зависимости от условия. Ниже приведен компонент и его внешний вид: -

public class ThreadComponent implements Runnable
{

....
....
....
....

public ThreadComponent()
{

    //................//
    //Initialization code for variables and some autowired components//
    //................//
}

@Override
public void run()
{

    if (condition)
        doThis();
    else if (condition)
        doThat();
    else if (condition)
        doThen();
    else if (condition)
        doWhere();
    else if (condition)
        doHow();
    else if (condition)
        doWhen();
    else if (condition)
        doNothing();
}

public void doThis() {
......
.....,
}

public void doThat() {
......
.....,
}

public void doThen() {
......
.....,
}

public void doWhere() {
......
.....,
}

public void doHow() {
......
.....,
}

public void doWhen() {
......
.....,
}

public void doNothing() {
......
.....,
}

}

Я называю этот компонент, используя TaskExecutor для задач. В ThreadComponent я также использовал @Autowired компоненты, которые я инициализирую в конструкторе, используя ApplicationContext. Но это замедляет мою обработку. Мне нужна помощь, чтобы я мог оптимизировать свой код, чтобы он стал лучше.

Обновление

Найдите переменные класса и конструктор компонента:

private DTO dto1;
private DTO2 dto2;
private Map<String, Object> dtoVal;
private String schemaName;
private int checkCondition;
private AppUser user;
private Details oldApprovalDetails;
private Details newApprovalDetails;
private ThreadDTO threadDTO;

@Autowired
OcrService ocrService;

@Autowired
NotificationService notificationService;

@Autowired
CreateRecordsService createRecordService;

@Autowired
DtoService dtoService;

@Autowired
DtoCalculations dtoCalculations;

@Autowired
MailService mailService;

@Autowired
TransDtoRepository transDtoRepository;

@Autowired
TransDtoApproverDetailsRepository approverDetails;


public ThreadComponent(ThreadDTO threadDTO,
        List<Details> approvalDetails, ApplicationContext ctx)
{


    this.dto1 = threadDTO.getDto1();
    this.dto2 = threadDTO.getDto2();
    this.dtoVal = threadDTO.getDto1().getConfig();
    this.schemaName = threadDTO.getDto1().getSchemaName();
    this.checkCondition = threadDTO.getCheckCondition();
    this.user = threadDTO.getUser();
    this.oldApprovalDetails = approvalDetails.get(0);
    this.newApprovalDetails = approvalDetails.get(1);
    this.threadDTO = threadDTO;
    this.ocrService = ctx.getBean(OcrService.class);
    this.notificationService = ctx.getBean(NotificationService.class);
    this.createRecordService = ctx.getBean(CreateRecordsService.class);
    this.dtoService = ctx.getBean(DtoService.class);
    this.dtoCalculations = ctx.getBean(DtoCalculations.class);
    this.mailService = ctx.getBean(MailService.class);
    this.transDtoRepository = ctx.getBean(TransDtoRepository.class);
    this.approverDetails = ctx.getBean(TransDtoApproverDetailsRepository.class);

}

Конструктор содержит все переменные, объявленные в области видимости класса.

...