Spring boot немедленного возврата результата не может выполнить функцию - PullRequest
1 голос
/ 15 мая 2019

Я хочу немедленно вернуть результат запроса к базе данных, но я хочу запустить другой поток, который выполняет некоторые действия.

Теперь я попробовал с Executor следующим образом:

  Executors.newScheduledThreadPool(1).schedule(
        () -> fooFunction(),
        1, TimeUnit.SECONDS
    );

но функция не выполняется после возврата метода.

Полный код:

@Override
@Transactional
public FooDto updateInfo(UpdateTaskDto updateTask) {
       // updating the entity

    Executors.newScheduledThreadPool(1).schedule(
        () -> fooFunction(),
        1, TimeUnit.SECONDS
    );

   return FooDto()
}

Где fooFunction - это просто функция, которая что-то сохраняет в базу данных и возвращает void.

Эта функция updateInfo находится внутри аннотированного класса @Service.

Почему это не работает?

EDIT:

@Transactional
@Override
public update() {
 if (hasStartDateChanges || hasEndDateChanges) {
        taskExecutor.execute(() -> {
            setNotifications(changedTaskDto, NotificationType.TASK_UPDATE_TIME, true, taskEntity.getProject().getCompany().getId(), currentUser);
        });
    }
}

public void setNotifications(TaskDto task, NotificationType type, boolean visibleForClient, Long companyId, UserDto currentUser) {
    ProjectEntity projectEntity = repository.findBy(task.getProjectId());
}

1 Ответ

3 голосов
/ 15 мая 2019

Вы можете просто добавить TaskExecutor или TaskScheduler и использовать его:

@RestController
@RequestMapping("/demo")
public static class DemoRestController {

    private final TaskExecutor taskExecutor;

    public DemoRestController(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }

    @GetMapping
    public String get() {
        taskExecutor.execute(() -> {
            System.out.println("Hello from Task");
        });
        return "hello";
    }
}

Из документов:

Выполнение и планирование задач. В отсутствие компонента Executor в контексте Spring Boot автоматически конфигурирует ThreadPoolTaskExecutor с разумными значениями по умолчанию, которые можно автоматически связать с асинхронным выполнением задач (@EnableAsync) и асинхронной обработкой запросов Spring MVC.

Источник: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-task-execution-scheduling

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...