使用Java TimerTask为HTTP调用设置硬超时 - DZone


Java TimerTask 可以帮助对使用 HTTP 客户端进行的 HTTP 调用应用硬超时。
Java TimerTask 提供了一种使用标准 Java Timer 类来安排任务的方法。当我们想要以固定的时间间隔运行任务时,这非常方便。此功能的另一个实际应用是当用户体验因长时间运行的 HTTP 调用而受到影响时,对 HTTP 调用执行硬超时。 
Java TimerTask是一个实现Runnable 接口的内置类。我们需要扩展这个类来创建我们自己的 TimerTask,它可以使用Java Timer类进行调度。
Java Timer 类本质上是线程安全的。换句话说,多个线程可以共享一个Timer 对象,而无需任何外部同步。 
Java HTTPClient 超时有套接字超时、连接超时,但是很多时候我们还需要在请求级别设置一个整体硬超时。例如,在下载一个潜在的大文件时,可能会建立连接,但我们需要确保操作不会超过某个阈值。Java HTTPClient 没有任何配置可以帮助我们实现这种硬超时。但是,它确实提供了一个中止 功能,我们可以将其与 TimerTask 一起使用以实现硬超时:

HttpGet getMethod = new HttpGet(
  "http://localhost:8080/api/employees/1");

int hardTimeout = 5;
// seconds
TimerTask task = new TimerTask() {
    @Override
    public void run() {
        if (getMethod != null) {
            getMethod.abort();
        }
    }
};
new Timer(true).schedule(task, hardTimeout * 1000);

HttpResponse response = httpClient.execute(getMethod);
System.out.println(
  
"HTTP Status of response: " + response.getStatusLine().getStatusCode());

正如您在此处看到的,我们创建了一个HttpGet 对象。接下来,我们创建一个TimerTask 并覆盖其run()方法以在需要时中止 HTTP 调用。现在,我们可以安排任务在 1 秒后运行。基本上,我们暗示在 1 秒后,将调用abort()方法并且 HTTP 调用将终止。最后,我们使用httpClient执行getMethod 。
至此,我们完成了对Java TimerTask的演示,以及我们如何使用abort() 方法使用它来实现 HTTP 请求的硬超时。