Посмотрите на аннотацию Spring @Async
. Если вы аннотируете компонент Service-layer этой аннотацией, он затем запускается в своем собственном потоке, позволяя потоку Controller работать без прерывания после вызова метода Service. У этого потока должно быть установлено значение, удерживаемое на уровне класса для Сервиса с помощью методов synchronous
, и ваш код контроллера может просто проверить эти переключатели по своему желанию, чтобы увидеть, выполнен ли процесс или нет. Что-то вроде:
@Service
public myServiceClass {
private boolean isDone = false;
public synchronized void setIsDone(boolean isDone) {
isDone = isDone;
}
public synchronized boolean getIsDone() {
return isDone;
}
@Async
public void myServiceMethod() {
...long-running stuff...
setIsDone(true);
}
В контроллере:
@Controller
class MyController {
@RequestMapping
public kickOffHandlerMethod() {
myServiceClass.myServiceMethod();
}
}
@RequestMapping
public dependentHandlerMethod() {
if(myServiceClass.getIsDone()) {
...do something...
}
}
}
Если бы более чем один запрос мог запустить процесс, я бы сохранил каждый переключатель isDone
в HashMap с каким-то идентификатором. Затем потоки будут обновлять отдельные переключатели, по одному для каждого запроса.