Na podstawie przykładów guawy, na których widziałem, szukałem eleganckich rozwiązań mojego problemu. Szczególnie podoba mi się sposób, w jaki działa Futures.addCallback(ListenableFuture, FutureCallback)
, ale chciałbym móc ustawić limit czasu na czas, który może wygasnąć przed wywołaniem FutureCallback. Optymalnie byłoby miło, gdyby przekroczenie limitu czasu spowodowało awarię FutureCallback.ListenableFuture, FutureCallback i timeout
Czy Guava już coś takiego ma? Czy po prostu nie zaleca się łączenia limitów czasu z odwołaniami?
EDYCJA: W tym przykład kodu, który doprowadził mnie do tego punktu. Oczywiście, usunąłem znaczące bity, aby uzyskać minimalny przykład.
@Test
public void testFuture()
{
Callable<Boolean> callable = new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
while(true);
}
};
ListenableFuture<Boolean> callableFuture = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()).submit(callable);
Futures.addCallback(callableFuture, new FutureCallback<Boolean>()
{
@Override
public void onFailure(Throwable arg0)
{
System.out.println("onFailure:"+arg0);
}
@Override
public void onSuccess(Boolean arg0)
{
System.out.println("onSuccess:"+arg0);
}
});
try
{
callableFuture.get(1000, TimeUnit.MILLISECONDS);
}catch(Throwable t)
{
System.out.println("catch:"+t);
}
}
Ten kod wyświetli tylko catch:java.util.concurrent.TimeoutException
.
Dzięki za zgłoszenie. Otworzyłem prośbę [tutaj] (http://code.google.com/p/guava-libraries/issues/detail?id=1146&thanks=1146&ts=1347504235). –