脚本宝典收集整理的这篇文章主要介绍了使用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,请注明来意。