Ждите метода, который возвращает 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;
    }
}
Другие вопросы по тегам