Estou usando uma interface API relacionada a dados que possui uma função de retorno de chamada key void que é invocada automaticamente para marcar o fim de algumas operações de IO. Quero fazer a classe Callable<String>
e usar Future<String> result
.
Eu me esforço para descobrir como fazer o Callable retornar uma String. Fazer uma String returnResult(){return this.result}
função para chamar internamente não funciona.
Por favor, avise.
Parece algo como:
public class MyCallable implements someAPIWrapper, Callable<String> {
String result;
@Override
public void endOfJobCallback() { //predefined API callback marking end of work
/*
usually read the data and write to a file, but not my case.
how to return this.result string from here?
*/
}
@Override
public String call() throws Exception {
//some logic stuff
//make API call to request a bunch of data
//inside a loop to listen to incoming messages, receiving and appending to the *result* variable
//end of all messages signalled by the ending callback, stop loop and return result var
}
}
class Main {
public static void main(String[] args){
MyCallable callable = new MyCallable();
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<String> future = executor.submit(callable);
String result = future.get(); //blocking until result ready
}
}
Você pode usar um booleano (atômico) para saber quando parar o loop:
Observação: não está claro exatamente como você ouve as mensagens porque você não adicionou nenhum código. Você pode querer pegar a ideia e adaptá-la ao código real, dependendo se você faz uma pesquisa curta, tem um webhook, etc.
Você poderia fazê-lo funcionar adicionando um
CompletableFuture
inMyCallable
e completando-o emendOfJobCallback()
.e então no seu
main()
:(é claro que isso requer certeza de que
endOfJobCallback()
é chamado em 100% dos casos, caso contrário, você pode precisar implementar algum tratamento de erros ou pode querer usarget(timeout, unit)
em vez dejoin()
)