使用SimpleTimeLimiter进行方法调用超时控制

发布时间:2019-11-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了使用SimpleTimeLimiter进行方法调用超时控制脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

原理

利用Executors的Future的限时get方法,GOOGLE的SimpleTimeLimITer本质上是对Executors的Future的包装。

实例

package com.facebook.presto.raptor.backup;  import com.facebook.presto.spi.PrestoException; import com.google.common.util.concurrent.SimpleTimeLimiter; import com.google.common.util.concurrent.TimeLimiter; import com.google.common.util.concurrent.UncheckedTimeoutException; import io.airlift.units.Duration;  import javax.annotation.PreDestroy;  import java.io.File; import java.util.OptionalLong; import java.util.UUID; import java.util.concurrent.ExecutorService;  import static com.facebook.presto.raptor.RaptorErrorCode.RAPTOR_BACKUP_TIMEOUT; import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static java.util.Objects.requireNonNull; import static java.util.concurrent.Executors.newCachedThreadPool; import static java.util.concurrent.TimeUnit.MILLISECONDS;  public class TimeoutBackupStore         implements BackupStore {     private final ExecutorService executor;     private final BackupStore store;      public TimeoutBackupStore(BackupStore store, String connectorId, Duration timeout)     {         requireNonNull(store, "store is null");         requireNonNull(connectorId, "connectorId is null");         requireNonNull(timeout, "timeout is null");         this.executor = newCachedThreadPool(daemonThreadsNamed("backup-proxy-" + connectorId + "-%s"));         this.store = timeLimited(store, BackupStore.class, timeout, executor);     }      @PreDestroy     public void shutdown()     {         executor.shutdownNow();     }      @Override     public void backupShard(UUID uuid, File source)     {         try {             store.backupShard(uuid, source);         }         catch (UncheckedTimeoutException e) {             throw new PrestoException(RAPTOR_BACKUP_TIMEOUT, "Shard backup timed out");         }     }      @Override     public void restoreShard(UUID uuid, File target)     {         try {             store.restoreShard(uuid, target);         }         catch (UncheckedTimeoutException e) {             throw new PrestoException(RAPTOR_BACKUP_TIMEOUT, "Shard restore timed out");         }     }      @Override     public OptionalLong shardSize(UUID uuid)     {         try {             return store.shardSize(uuid);         }         catch (UncheckedTimeoutException e) {             throw new PrestoException(RAPTOR_BACKUP_TIMEOUT, "Shard backup size fetch timed out");         }     }      private static <T> T timeLimited(T target, Class<T> clazz, Duration timeout, ExecutorService executor)     {         TimeLimiter limiter = new SimpleTimeLimiter(executor);         return limiter.newProxy(target, clazz, timeout.toMillis(), MILLISECONDS);     } }@H_512_194@

参考

脚本宝典总结

以上是脚本宝典为你收集整理的使用SimpleTimeLimiter进行方法调用超时控制全部内容,希望文章能够帮你解决使用SimpleTimeLimiter进行方法调用超时控制所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。