Retrofit自定义超时不能正常工作



我有一个客户端,在特定超时情况下执行n次重试,当我在模拟器中执行测试时,每次重试总是需要40秒,甚至更多,我配置的时间是5秒。

我通过注释这三行来执行测试:
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)

期望它使用默认超时(10秒),有时结果是正确的(10秒),执行几次后时间不再匹配。

同样在物理设备上执行测试,会发生同样的事情。

知道发生了什么事吗?

object Client {
private const val PATTERN = "0000"
private const val S_TAG = "{SN}"
private const val C_TAG = "{CC}"
/**
* Retrofit Builder is created
* @param sNbr
* @param cCode
* @return Retrofit
*/
private fun createRetrofitBuilder(
sNbr: String,
cCode: String
): Retrofit {
val builder = Retrofit.Builder().baseUrl(
getServer(
sNbr,
cCode))
.client(CertificateValidation.getUnsafeOkHttpClient())
.addConverterFactory(SimpleXmlConverterFactory.create())
return builder.build()
}
/**
* Gets URL of request.
* @param sNbr
* @param cCode
* @return server
*/
private fun getServer(sNbr: String, cCode: String): String {
var server = Constants.URL_SERVICE
server = server.replace(S_TAG,
getStString(
storeNbr
)
)
server = server.replace(C_TAG, countryCode)
return server
}
/**
* 
*/
private fun getStString(sNbr: String): String {
val decimalFormat = DecimalFormat(PATTERN)
return decimalFormat.format(sNbr.toInt())
}
/**
* @param serviceType
* @return T
*/
fun <T> buildService(
serviceType: Class<T>,
sNbr: String,
cCode: String
): T {
return createRetrofitBuilder(
sNbr,
cCode
).create(serviceType)
}}

CertificateValidation.kt

class CertificateValidation {
companion object {

private const val TIMEOUT: Long = 5
/**
* Method that validates the SSL certificate sent from the Service.
*/
fun getUnsafeOkHttpClient(): OkHttpClient {
// Create a trust manager that does not validate certificate chains
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
@Throws(CertificateException::class)
override fun checkClientTrusted(
chain: Array<java.security.cert.X509Certificate>,
authType: String
) {
}
@SuppressLint("TrustAllX509TrustManager")
@Throws(CertificateException::class)
override fun checkServerTrusted(
chain: Array<java.security.cert.X509Certificate>,
authType: String
) {
}
override fun getAcceptedIssuers(): Array<java.security.cert.X509Certificate> {
return arrayOf()
}
})
// Install the all-trusting trust manager
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
// Create an ssl socket factory with our all-trusting manager
val sslSocketFactory = sslContext.socketFactory
val builder = OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectionSpecs(
listOf(
ConnectionSpec.COMPATIBLE_TLS,
ConnectionSpec.CLEARTEXT
)
)
builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
return builder.build()
}

}}

你应该阅读https://www.baeldung.com/okhttp-timeouts

很可能您想使用callTimeout来控制整个调用的单个超时。使用连接重用连接,读写超时通常不会由于同一底层IO套接字上的其他请求而触发。

OkHttpClient client = new OkHttpClient.Builder()
.callTimeout(10, TimeUnit.SECONDS)
.build();

事件侦听器通常会让您更好地理解请求拦截器https://square.github.io/okhttp/events/

最新更新