实现超时的设计模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现超时的设计模式相关的知识,希望对你有一定的参考价值。
我正在尝试为我的服务设计操作超时逻辑。每个操作都与多个下游服务进行交互(同步和异步)。目的是能够在一定时间后终止操作而不管状态如何。
是否有任何可以在解决方案中使用的设计模式?
答案
您可以使用Future访问下游服务,然后使用某种事件驱动方法来处理成功/超时。
public interface ICallback {
public void onSuccess(DsObject object);
public void onTimeout();
}
您访问下游服务的方式可能如下所示:
public class DownstreamConnector implements Callable<DsObject> {
@Override
public DsObject call() {
// Invoke your downstream services here
return ...
}
}
然后,您可以围绕Future<>
包装callable以调用下游服务并检查超时。
final ICallback callback = new MyCallbackHandler();
final DownstreamConnector connector = new DownstreamConnector()
ExecutorService executor = ...
Future<DsObject> future = executor.submit(connector);
try {
DsObject result = future.get(TIMEOUT, TimeUnit.MILISECONDS);
// Operation completed
callback.onSuccess(result);
} catch (TimeoutException ex) {
logger.error("Operation timed out", ex);
future.cancel(true);
// Timed out
callback.onTimeout();
}
只是一个评论:
future.cancel(true);
不会停止正在运行的底层任务,它只是将正在运行的线程的中断标志设置为true。你的代码负责检查这个标志并抛出InterruptedException
,如果它是真的。
以上是关于实现超时的设计模式的主要内容,如果未能解决你的问题,请参考以下文章