diff --git a/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java b/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java index c517924b2..498f5522e 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttpBuilder.java @@ -9,6 +9,7 @@ import io.dapr.config.Properties; import okhttp3.OkHttpClient; import java.time.Duration; +import java.util.concurrent.atomic.AtomicReference; /** * A builder for the DaprHttp. @@ -16,21 +17,30 @@ import java.time.Duration; public class DaprHttpBuilder { /** - * Read timeout for http calls. + * Singleton OkHttpClient. */ - private static final Duration DEFAULT_READ_TIMEOUT = Duration.ofSeconds(60); + private static final AtomicReference OK_HTTP_CLIENT = new AtomicReference<>(); + + /** + * Static lock object. + */ + private static final Object LOCK = new Object(); /** * Read timeout used to build object. */ - private Duration readTimeout = DEFAULT_READ_TIMEOUT; + private Duration readTimeout = Duration.ofSeconds(Properties.HTTP_CLIENT_READTIMEOUTSECONDS.get()); /** * Sets the read timeout duration for the instance to be built. * + *

Instead, set environment variable "DAPR_HTTP_CLIENT_READTIMEOUTSECONDS", + * or system property "dapr.http.client.readtimeoutseconds". + * * @param duration Read timeout duration. * @return Same builder instance. */ + @Deprecated public DaprHttpBuilder withReadTimeout(Duration duration) { this.readTimeout = duration; return this; @@ -52,9 +62,17 @@ public class DaprHttpBuilder { * @return Instance of {@link DaprHttp} */ private DaprHttp buildDaprHttp() { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.readTimeout(this.readTimeout); - OkHttpClient okHttpClient = builder.build(); - return new DaprHttp(Properties.SIDECAR_IP.get(), Properties.HTTP_PORT.get(), okHttpClient); + if (OK_HTTP_CLIENT.get() == null) { + synchronized (LOCK) { + if (OK_HTTP_CLIENT.get() == null) { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.readTimeout(this.readTimeout); + OkHttpClient okHttpClient = builder.build(); + OK_HTTP_CLIENT.set(okHttpClient); + } + } + } + + return new DaprHttp(Properties.SIDECAR_IP.get(), Properties.HTTP_PORT.get(), OK_HTTP_CLIENT.get()); } } diff --git a/sdk/src/main/java/io/dapr/config/Properties.java b/sdk/src/main/java/io/dapr/config/Properties.java index bcd27f508..79c58ea40 100644 --- a/sdk/src/main/java/io/dapr/config/Properties.java +++ b/sdk/src/main/java/io/dapr/config/Properties.java @@ -38,6 +38,11 @@ public class Properties { */ private static final Charset DEFAULT_STRING_CHARSET = StandardCharsets.UTF_8; + /** + * Dapr's default timeout in seconds for HTTP client reads. + */ + private static final Integer DEFAULT_HTTP_CLIENT_READTIMEOUTSECONDS = 60; + /** * IP for Dapr's sidecar. */ @@ -86,4 +91,12 @@ public class Properties { "DAPR_STRING_CHARSET", DEFAULT_STRING_CHARSET, (s) -> Charset.forName(s)); + + /** + * Dapr's timeout in seconds for HTTP client reads. + */ + public static final Property HTTP_CLIENT_READTIMEOUTSECONDS = new IntegerProperty( + "dapr.http.client.readtimeoutseconds", + "DAPR_HTTP_CLIENT_READTIMEOUTSECONDS", + DEFAULT_HTTP_CLIENT_READTIMEOUTSECONDS); } diff --git a/sdk/src/test/java/io/dapr/client/DaprHttpBuilderTest.java b/sdk/src/test/java/io/dapr/client/DaprHttpBuilderTest.java index 0e37e1594..5e984d78b 100644 --- a/sdk/src/test/java/io/dapr/client/DaprHttpBuilderTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprHttpBuilderTest.java @@ -9,37 +9,26 @@ import okhttp3.OkHttpClient; import org.junit.Test; import java.lang.reflect.Field; -import java.time.Duration; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; public class DaprHttpBuilderTest { @Test - public void withReadTimeout() throws Exception { - DaprHttpBuilder daprHttpBuilder = new DaprHttpBuilder(); - Duration duration = Duration.ofSeconds(999); - daprHttpBuilder.build(); - DaprHttpBuilder dapr = daprHttpBuilder.withReadTimeout(duration); - assertNotNull(dapr); + public void singletonOkHttpClient() throws Exception { + DaprHttp daprHttp = new DaprHttpBuilder().build(); + DaprHttp anotherDaprHttp = new DaprHttpBuilder().build(); - DaprHttp daprHttp = daprHttpBuilder.build(); - assertOKHttpPropertyValue(daprHttp, "readTimeoutMillis", (int)duration.toMillis()); + assertSame(getOkHttpClient(daprHttp), getOkHttpClient(anotherDaprHttp)); } - private static final void assertOKHttpPropertyValue(DaprHttp daprHttp, String propertyName, Object expectedValue) throws Exception { - // First, get okHttpClient. + private static OkHttpClient getOkHttpClient(DaprHttp daprHttp) throws Exception { Field httpClientField = DaprHttp.class.getDeclaredField("httpClient"); httpClientField.setAccessible(true); OkHttpClient okHttpClient = (OkHttpClient) httpClientField.get(daprHttp); assertNotNull(okHttpClient); - - Field propertyField = OkHttpClient.class.getDeclaredField(propertyName); - propertyField.setAccessible(true); - Object value = propertyField.get(okHttpClient); - assertNotNull(value); - assertEquals(expectedValue, value); + return okHttpClient; } } \ No newline at end of file