9 Temmuz 2019 Salı

SpringContext ListenableFuture Arayüzü

Giriş
Şu satırı dahil ederiz.
import org.springframework.util.concurrent.ListenableFuture;
- Sanırım Java 8'den itibaren bu sınıf yerine CompletableFuture nesnesini kullanmak daha iyi. 
- Bu sınıf Guava kütüphanesindeki com.google.common.util.concurrent.ListenableFuture arayüzünden ilham alınarak geliştirilmiş.

addCallback metodu - ListenableFutureCallback
ListenableFutureCallback arayüzünde onSuccess() ve onFailure() metodları var. Bu metodlar, gerçek işi yapan yani Future nesnesini complete olarak işaretleyen thread tarafından çalıştırılıyor. Açıklaması şöyle
For others who might have the same question i want to add the observed behavior (not officially documented AFAIK, if not folks can correct & point me to it).

The observed behavior as i suspected is that they are being executed by the thread that completes the future.

It would have been nice if the spring implementation had provided the same support as the guava one, but as it stands the above behavior is what we have.
Örnek
Şöyle yaparız.
ListenableFuture<MyEntity> future = ...;
future.addCallback(it -> {
  System.out.println("Pass");
}, throwable -> {
  System.out.println("fail");
});
Örnek
Elimizde şöyle bir kod olsun.
public class ResponseCallBack<T> implements ListenableFutureCallback<ResponseEntity<T>>{

  @Override
  public void onSuccess(ResponseEntity<T> stringResponseEntity) {
    ...
  }

  @Override
  public void onFailure(Throwable ex) {
    ...
  }

}
Şöyle yaparız.
ResponseCallBack responseCallBack = ...;

ListenableFuture restCall = ...;
restCall.addCallback(responseCallBack);
toCompletableFuture metodu
ListenableFuture nesnesini Java 8 ile gelen CompletableFuture nesnesine dönüştürür.
 
Örnek
Şöyle yaparız.
@GetMapping(value = "/asyncNonBlockingRequestProcessing")
public CompletableFuture<String> asyncNonBlockingRequestProcessing(){
  ListenableFuture<String> listenableFuture = getRequest.execute(
    new AsyncCompletionHandler<String>() {
      @Override
      public String onCompleted(Response response) throws Exception {
        logger.debug("Async Non Blocking Request processing completed");
        return "Async Non blocking...";
      }
    });
  return listenableFuture.toCompletableFuture();
}

Hiç yorum yok:

Yorum Gönder