design-patterns - 实现超时的设计模式
问题描述
我正在尝试为我的服务设计操作超时逻辑。每个操作都与多个下游服务交互(同步和异步)。目的是能够在一定时间后终止操作,而不管状态如何。
有没有可以在解决方案中利用的设计模式?
解决方案
您可以使用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 ...
}
}
然后,您可以将 callable 包装在 a 周围Future<>
以调用您的下游服务并检查超时。
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
在其为真时抛出。
推荐阅读
- haskell - 如何在没有编码的情况下在 Haskell 中进行 IO?
- dialogflow-es - 如何让代理使用Dialogflow在whatsapp中初始化聊天?
- angular - 使用 TypeORM / NestJS 连接到 MongoDB 更改流
- html - 如何通过引导程序在轮播中设置相等的高度?
- python - 在 ipyleaflet 中看不到 USGS WMS 层(leaflet.js for python)
- java - Azure 工具包错误无法执行运行配置
- python - 我无法打开用于在 python 中写入的文件,它给了我一个错误
- database - 如何在没有 localhost 127.0.0.1 的情况下单击 Laravel 中的链接?
- sql - 从 Teradata 中的范围创建行级数据
- php - 通过邮件 PHP 发送回显输出