Ждите метода, который возвращает DeferredResult
У меня есть метод обслуживания, который возвращает DefferedResult<Foo>
через несколько секунд, но мне нужно, чтобы мой код дождался завершения этого метода и вернул отложенный результат с заданным результатом.
Вот пример кода:
@Service
public class FooService {
// ...
public DeferredResult<Foo> fetchFoo(long id) throws InterruptedException {
DeferredResult<Foo> fooDeferredResult = new DeferredResult<>();
concurrentMap.put(id, fooDeferredResult);
return fooDeferredResult;
}
// this you can figure out as some handler or scheduler which receive messages and is called
public void anotherMethod(Foo foo) {
DeferredResult<Foo> remove = concurrentMap.remove(foo.getId());
remove.setResult(foo);
}
// ...
}
и я хочу позвонить в другой сервис:
@Service
public class AnotherService {
@Autowired
FooService fooService;
public Foo bar(long id) {
// some logic
Foo foo = fooService.fetchFoo(id).getResult();
// another logic which depends on received foo
// there I need wait for result of fetchFoo method
return foo;
}
}
Подскажите пожалуйста, как обеспечить такое поведение? Спасибо за совет.
2 ответа
fooService.fetchFoo(id).setResultHandler(result -> {
// do something
});
Вы можете использовать
CountDownLatch
для синхронизации. Пример:
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println(1);
CountDownLatch latch = new CountDownLatch(1);
getResult()
.setResultHandler(result -> {
System.out.println(2 + " " + result);
latch.countDown();
});
latch.await();
System.out.println(3);
}
public static DeferredResult<String> getResult() {
DeferredResult<String> result = new DeferredResult<>();
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result.setResult("Hello");
})
.start();
return result;
}
}