HttpClient异常处理

HttpClient 能够抛出两种类型的异常:在 I/O 失败时,如套接字连接超时或被重置的java.io.IOException 异常,还有标志 HTTP 请求失败的信号,如违反 HTTP 协议的HttpException 异常。通常 I/O 错误被认为是非致命的和可以恢复的,而 HTTP 协议错误则被认为是致命的而且是不能自动恢复的。

一、HTTP运输安全

要理解 HTTP 协议并不是对所有类型的应用程序都适合的,这一点很重要。HTTP 是一个简单的面向请求/响应的协议,最初被设计用来支持取回静态或动态生成的内容。它从未向支持事务性操作方向发展。比如,如果成功收到和处理请求,HTTP 服务器将会考虑它的其中一部分是否完成,生成一个响应并发送一个状态码到客户端。如果客户端因为读取超时,请求取消或系统崩溃导致接收响应实体失败时,服务器不会试图回滚事务。如果客户端决定重新这个请求,那么服务器将不可避免地不止一次执行这个相同的事务。在一些情况下,这会导致应用数据损坏或者不一致的应用程序状态。尽管 HTTP 从来都没有被设计来支持事务性处理,但它也能被用作于一个传输协议对关键的任务应用提供被满足的确定状态。要保证 HTTP 传输层的安全,系统必须保证 HTTP 方法在应用层的幂等性。

二、终止请求

在一些情况下,由于目标服务器的高负载或客户端有很多活动的请求,那么 HTTP 请求执行会在预期的时间框内而失败。这时,就可能不得不过早地终止请求,解除封锁在 I/O 执行中的线程封锁。被 HttpClient 执行的 HTTP 请求可以在执行的任意阶段通过调用HttpUriRequest#abort()方法而终止。这个方法是线程安全的,而且可以从任意线程中调用。当一个 HTTP 请求被终止时,它的执行线程就封锁在 I/O 操作中了,而且保证通过抛出 InterruptedIOException 异常来解锁

相关推荐