我是可完成未来领域的新手。无论如何,我有这个基本的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)无法应用于()。
谢谢!
答案 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
)