Minha tarefa é simples para baixar um arquivo de uma url usando selênio. Eu fiz até clicar na parte download. Agora eu quero esperar até que o arquivo é downloaded.Fine. Eu uso seguinte e feito.
do {
Thread.sleep(60000);
}
while ((downloadeBuild.length()/1024) < 138900);
Agora desafio é por quanto tempo posso esperar? Posso definir um limite? Eu posso pensar é usar um contador em fazer enquanto e verificação até balcão vai para 10 ou algo assim? Mas nenhuma outra maneira em Java? Como tal, eu não tenho qualquer ação para fazer até que o arquivo é baixado.
Que tal agora?
Acho que usando TimeOut
não é estável, pois não há necessidade de esperar por um un-previsível operação de download.
Você pode simplesmente virar a CompletableFuture
usar supplyAsync
para fazer o download e usar thenApply
para fazer o processamento / conversão e recuperar o resultado por join
como segue:
public class SimpleCompletableFuture {
public static void main(String... args) {
testDownload();
}
private static void testDownload() {
CompletableFuture future = CompletableFuture.supplyAsync(() -> downloadMock())
.thenApply(SimpleCompletableFuture::processDownloaded);
System.out.println(future.join());
}
private static String downloadMock() {
try {
Thread.sleep(new Random().nextInt() + 1000); // mock the downloading time;
} catch (InterruptedException ignored) {
ignored.printStackTrace();
}
return "Downloaded";
}
private static String processDownloaded(String fileMock) {
System.out.println("Processing " + fileMock);
System.out.println("Done!");
return "Processed";
}
}