转换可完成的未来

时间:2019-08-20 15:11:43

标签: spring-boot completable-future

我是可完成未来领域的新手。无论如何,我有这个基本的JPA应用程序,我想使用异步调用。但是我不希望该服务返回可完成的未来。

这个很好用,但是..

   @Async
    @Cacheable(value="distributors")
    public CompletableFuture<Iterable<Distributors>> getAllDistributorsAsyncCaching() throws ExecutionException, InterruptedException {

        Iterable<Distributors> result = distributorsRepository.findAll();
        return CompletableFuture.completedFuture(result);



    }

我希望函数仅返回可迭代的内容:


   @Async
    @Cacheable(value="distributors")
    public Iterable<Distributors> getAllDistributorsAsyncCaching() throws ExecutionException, InterruptedException {

        Iterable<Distributors> result = distributorsRepository.findAll();
        return CompletableFuture.completedFuture(result);



    }

我尝试使用completeablefuture.get(),但问题是它变慢了, 然后我尝试用completeablefuture.complete()它使我在CompleteableFuture中的complete(Iterable)无法应用于()。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将@Async放在您的存储库方法中:

public interface FooRepository extends JpaRepository<Foo, Long> {
    @Async
    @Query("select f from Foo f")
    CompletableFuture<List<Foo>> findAllFoos();
}

然后在您的服务中使用:

@Service
public class FooService {

    @Autowired
    private FooRepository fooRepository;

    public List<Foo> getFoos() {
        CompletableFuture<List<Foo>> futureFoos = fooRepository.findAllFoos();
        List<Foo> foos = null;

        try {
            foos = futureFoos.get();
        } catch (InterruptedException | ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return foos;
    }
}

这是我的测试(我使用h2内存数据库):

@RunWith(SpringRunner.class)
@SpringBootTest
public class FooTests {

    @Autowired
    private FooRepository fooRepository;

    @Autowired
    private FooService fooService;

    @Before
    public void setUp() {
        for (int i = 0; i < 100000; i++) {
            Foo foo = new Foo();
            foo.setId(Long.valueOf(i));
            foo.setName("foo" + i);
            fooRepository.save(foo);
        }
    }

    @Test
    public void test() {        
        System.out.println(fooService.getFoos().size());
    }
}

您可以将@Cacheable设置为服务方法(此处为getFoos