实现超时的设计模式

问题描述 投票:1回答:1

我正在尝试为我的服务设计操作超时逻辑。每个操作都与多个下游服务进行交互(同步和异步)。目的是能够在一定时间后终止操作而不管状态如何。

是否有任何可以在解决方案中使用的设计模式?

design-patterns
1个回答
0
投票

您可以使用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,如果它是真的。


© www.soinside.com 2019 - 2024. All rights reserved.